sitelink1  
sitelink2  
sitelink3  
extra_vars4  
extra_vars5  
extra_vars6  

"com.fasterxml.jackson" 과 "com.googlecode.json-simple" 라이브러리는 json data 를 다루는 유틸 라이브러리이다.

jackson 에는 JsonNode 가 있고 json-simple 에는 JSONObject 가 있다.

처음에는 JSONObject 를 주로 사용해서 json data 를 처리 했었는데

얼마전부터 JsonNode 를 사용하게 되었다.

 

JsonNode 를 사용하게 된 이유는 JsonNode 의 get() 함수가 method chaining 방식으로 JsonNode 를 리턴하기 때문에

json data 를 탐색할때 데이터 탐색시 작성이 매우 쉽고 코드 가독성이 높다. (당연히 유지보수가 쉽다)

 

하지만 jackson 에서 JsonNode 를 생성할때는 new 키워드로 생성 할 수가 없다.

최상위 ObjectNode 의 instance 를 다음과 같이 생성해서 JsonNode 로 형변환하여 사용하게 된다.

 

ObjectMapper objectMapper = new ObjectMapper();

ObjectNode rootNode = objectMapper.createObjectNode();

 

위와 같은 번거로움 때문에 JsonNode 의 사용이 번거로웠다.

이리저리 고민하다가 결국 나는 두가지 라이브러리를 함께 사용하는 것으로 결론 지었는데

json data 를 탐색할때는 JsonNode 로 사용하고 json object 를 이용하여 간단한 조작을 할때는 JSONObject 를 사용하게 하였다.

그리고 두 타입의 형변환은 다음과 같은 유틸성 함수를 만들어 사용하여 두가지 모두 이용하게 되었다.

 

    /**

     * JsonNode instance를 JSONObject instance로 변환

     * @param jsonNode

     * @return

     */

    public static JSONObject jsonNodeToJSONObject(JsonNode jsonNode) {

        try {

            // ObjectMapper를 사용하여 JsonNode를 String으로 변환

            ObjectMapper mapper = new ObjectMapper();

            String jsonString = mapper.writeValueAsString(jsonNode);

 

            // 변환된 JSON 문자열을 JSONObject로 변환

            return parseJSONObject(jsonString);

        } catch (Exception e) {

            e.printStackTrace();

            return null; // 예외 발생 시 null 반환

        }

    }

    

    /**

     * JSONObject instance를 JsonNode instance로 변환

     * 단, json data 의 모든 parameter 의 value 는 object reference 가 아니어야 한다.

     * @param jsonObject

     * @return

     * @throws Exception

     */

    public static JsonNode jsonObjectToJsonNode(JSONObject jsonObject) throws Exception {

        ObjectMapper objectMapper = new ObjectMapper();

        return objectMapper.readTree(jsonObject.toString());

    }

 

JSONObject 를 JsonNode 로 변환시의 주의점은 함수의 주석에 적혀 있다.

casting 시 내부적으로 오류가 발생하지만 오류 내용이 출력되지는 않는다.