본문 바로가기

JAVA

[JAVA] JSON 데이터 HashMap에 담는 방법

안녕하세요. 

컨씨브이개발자입니다.


Java Spring프레임워크 기반의 시스템을 다루면서 DB 컬럼에 들어있는 JSON 값이나

REST API를 통해 받아온 JSON 데이터를 다시 DB에 적재하거나 화면에 보여주기 위해서 

JSON데이터 형식의 String 값을 ObjectMapper를 이용해 HashMap에 담아 많이 활용합니다.

 

다음 3가지 종류가 있습니다.

1. 일반 JSON 형식

2. JSON안의 JSON 형식

3. JSON안의 JSON 배열


 

1. 일반 JSON 형식
{"name":"jiwoong_java", "age":"31", "sex":"male"}

ObjectMapper를 사용하기 위해선 먼저 jackson 라이브러리가 추가되어 있어야 합니다.

보통의 실무자가 다루는 시스템에서는 모두 추가되어 있을 것입니다.

하지만 추가가 되어있지 않거나 테스트를 해야할 경우엔 pom.xml에 종속성 추가를 해줘야 합니다.

<dependencies>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.4</version>
    </dependency>
</dependencies>

 

추가를 하고 나면 java 소스부분에서 ObjectMapper를 사용할 수 있게 import가 됩니다.

import com.fasterxml.jackson.databind.ObjectMapper;

 

아래는 예제 소스입니다.

import java.util.HashMap;
import java.util.Map.Entry;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

	public static void main(String[] args) {

		//jsonString = {"name":"jiwoong_java", "age":"31", "sex":"male"};
		String jsonString = "{ \"name\" : \"jiwoong_java\", \"age\" : \"31\", \"sex\" : \"male\"  }";
		
		ObjectMapper objectMapper = new ObjectMapper();
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		try {
			map = objectMapper.readValue(jsonString, HashMap.class);	
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		for(Entry<String, Object> val : map.entrySet()) {
			System.out.println("key : "+val.getKey()+" | value : "+val.getValue());
		}
		
	}
}

결과 값

key : sex | value : male
key : name | value : jiwoong_java
key : age | value : 31

 

 

2. JSON안의 JSON 형식
{"field":{"name":"jiwoong_java", "age":"31", "sex":"male"}}

실무에서 타시스템과 API 연동을 한다면 보통 위와 같은 형식으로 보낸다.

그래서 field 안의 내용만 읽어야 하는데, String 변수에 담아 substring으로 잘라내도 되고

JSONObject를 활용해서 field의 값만 빼낼 수 있다.

 

String으로 자르는 법

String jsonString = "{\"field\":{\"name\":\"jiwoong_java\", \"age\":\"31\", \"sex\":\"male\"}}";
jsonString = jsonString.substring(9, jsonString.length()-1);
System.out.println(jsonString);

결과 값

{"name":"jiwoong_java", "age":"31", "sex":"male"}

 

JSONObject 사용법

JSONObject를 사용하기 위해선 종속성 추가가 필요하다

<dependency>
  <groupId>com.googlecode.json-simple</groupId>
  <artifactId>json-simple</artifactId>
  <version>1.1.1</version> 
</dependency>

 

JSON 데이터가 String 변수에 담겨져 있다고 가정 후 JSONParser를 통해 JSONObject로 변환한다.

그 후 HashMap에 담도록 한다.

아래는 예시 소스입니다.

import java.util.HashMap;
import java.util.Map.Entry;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

	public static void main(String[] args) throws ParseException {
		
        	//jsonString = {"field":{"name":"jiwoong_java", "age":"31", "sex":"male"}};
		String jsonString = "{\"field\":{\"name\":\"jiwoong_java\", \"age\":\"31\", \"sex\":\"male\"}}";
		
		JSONParser jsonParser = new JSONParser(); 
		JSONObject jsonObject = (JSONObject) jsonParser.parse(jsonString);
		
		System.out.println("field 값 : ");
		System.out.println(jsonObject.get("field"));
		System.out.println("");
		
		jsonString = jsonObject.get("field").toString();
		
		ObjectMapper objectMapper = new ObjectMapper();
		
		HashMap<String, Object> map = new HashMap<String, Object>();
		try {
			map = objectMapper.readValue(jsonString, HashMap.class);	
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		for(Entry<String, Object> val : map.entrySet()) {
			System.out.println("key : "+val.getKey()+" | value : "+val.getValue());
		}
	
	}
}

결과 값

field 값 : 
{"sex":"male","name":"jiwoong_java","age":"31"}

key : sex | value : male
key : name | value : jiwoong_java
key : age | value : 31

 

3. JSON안의 JSON 배열
{"field":[{"name":"jiwoong_java", "age":"31"}, {"name":"ahhyun_java", "age":"26"}]}

배열형태의 JSON 데이터를 보낼 경우도 매우 많습니다.

위의 예제를 응용하여 List형 HashMap에 담아 사용할 수 있습니다.

여기선 List<HashMap<String, Object>> 형을 선언 합니다.

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

	public static void main(String[] args) throws ParseException {

		//jsonString = {"field":[{"name":"jiwoong_java", "age":"31"}, {"name":"ahhyun_java", "age":"26"}]}
		String jsonString = "{\"field\":[{\"name\":\"jiwoong_java\", \"age\":\"31\"}, {\"name\":\"ahhyun_java\", \"age\":\"26\"}]}";
		
		JSONParser jsonParser = new JSONParser(); 
		JSONObject jsonObject = (JSONObject) jsonParser.parse(jsonString);

		ObjectMapper objectMapper = new ObjectMapper();
		
		List<HashMap<String, Object>> map = new ArrayList<HashMap<String, Object>>();
		
		try {
			map = objectMapper.readValue(jsonObject.get("field").toString(), List.class);	
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		for(int i = 0; i < map.size(); i++) {
			System.out.println(map.get(i).get("name")+" | "+map.get(i).get("age"));
		}
	
	}
}

결과 값

jiwoong_java | 31
ahhyun_java | 26

 

참고로 ObjectMapper의 readValue 함수는 String을 매개변수로 받는데 String이 아닌 Object형이거나

아래와 같이 JSONObject형일 경우 convertValue 함수를 사용하면된다.

map = objectMapper.convertValue(jsonObject.get("field"), List.class);

 

여기까지 제가 실무 개발에서 JSON 데이터를 받아 Map에 넣고 사용하는 방법들을 나열해보았다.

그 외 JSON을 다루다 보면 여러가지 일이 생기는데 다음 글에서 알아보도록 하겠다.

 

더 좋은 방법이 있거나, 대용량 데이터를 처리하는 방법이 있다면 댓글로 소개부탁드립니다.

감사합니다.