java

JAVA | to JSON

no-easy-ray 2021. 5. 11. 22:52

현재 회사에서는 여러 클러스터의 메트릭 정보를 가지고와 화면으로 보여주는 대쉬보드 형태의 웹을 개발하고 있다.

개발하는 과정에서 다른 서버로부터 받아온 데이터를 JSON형태 또는 객체 형태로 변환하여 사용해야하는 일이 많았다.

그때 그때 마다 따로 정리해두지 않아 간단한 내용인데도 계속 찾아보는 내 모습이 너무 비효율적으로 일하는거 같아 보였고, 이참에 따로 정리를 해두려고 한다.

 

현재는 java로 개발을 하고있다.

근데 구글링을 하면서 찾아볼때마다 주로 jackson과 gson을 사용하는 예제가 많아 이부분을 정리하려고 한다. (실제 프로젝트에서도 사용하기 때문...)

Jackson

먼저 시작하기에 앞서서 의존성을 추가하도록 한다.

# gradle
dependencies {
...
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.2'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.12.2'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.12.2'
...
}

 

최신 버전에서 가장 사용률이 많은 버전을 사용했다.
https://mvnrepository.com/

 

다음과 같은 json String이 존재한다고 생각해보자.

String jsonData = "\{\n" +
                  "    \"id\":\"twoendthree\",\n" +
                  "    \"description\":\"blog\"\n" +
                  "}";

 

이때 ObjectMapper를 이용해서 Json으로 변환 할 수있다.

ObjectMapper mapper = new ObjectMapper();

try {
	//Map형태로 변환
	Map<String,String> map = mapper.readValue(jsonData, ap.class);

	System.out.println(map.get("id"));
	System.out.println(map.get("description"));

	} catch (JsonProcessingException e) {
	e.printStackTrace();
}
이때 변환할 형태에 맞는 스타일을  mapper.readValue 에서 지정해 주면 된다.

 

# jsonArray일 경우

String exampleJsonArrayStr = "[{\n" +
                "            \"name\":\"two\",\n" +
                "            \"wallet\":{\n" +
                "                \"coin\":\"BTC\",\n" +
                "                \"money\":\"10000\"\n" +
                "            }\n" +
                "        },\n" +
                "        {\n" +
                "            \"name\":\"end\",\n" +
                "                \"wallet\":{\n" +
                "            \"coin\":\"ETH\",\n" +
                "                    \"money\":\"3000\"\n" +
                "        }\n" +
                "        }]";
                    

ObjectMapper mapper = new ObjectMapper();

List<Map<String,Map<String,String>>> parsedJsonArray = mapper.readValue(exampleJsonArrayStr, List.class);

for(Map<String,Map<String,String>> parsedJson : parsedJsonArray){
  System.out.println(parsedJson.get("name"));
  System.out.println(parsedJson.get("wallet").get("coin"));
  System.out.println(parsedJson.get("wallet").get("money"));
}
이런식으로 json의 형태에 맞게 Map으로 변환 할 수도 있고, 지금 예제처럼 형태가 동일하다면 따로 객체를 만들어서 객체로 바로 변환 할 수도 있다.

 

Account Class를 작성

# Account.java
@ToString
@Setter
@Getter
@NoArgsConstructor
class Account{
    private String name;
    private Wallet wallet;

    @ToString
    @Setter
    @Getter
    @NoArgsConstructor
    class Wallet{
        private String coin;
        private String money;
    }
}

 

JsonArrayString을 Account List형태로 변환

ObjectMapper mapper = new ObjectMapper();

Account[] accounts = mapper.readValue(exampleJsonArrayStr, Account[].class);

Iterator iterator = Arrays.asList(accounts).iterator();
while (iterator.hasNext()){
	System.out.println(iterator.next().toString());
}