자바 JSON 만들기, 추가, 제거, 파싱하는 법과 예제

728x90

자바 JSON 만들기, 추가, 제거, 파싱하는 법과 예제

 

 

json simple 라이브러리 설치

작업환경 : 이클립스

 

JSON을 쉽게 가공하기 위해 미리 만들어진 라이브러리를 이용한다.

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

json simple 1.1.1.jar를 다운받는다.

 

라이브러리를 적용할 프로젝트를 오른쪽 마우스 클릭 - Build Path -  Configure Build Path...로 들어간다.

 

Modulepath를 클릭하고 오른쪽에 있는 Add External JARs...를 클릭한다.

 

아까 다운받은 jar파일을 선택하고 열기를 클릭. 그리고 Apply and close를 누르면 프로젝트에 라이브러리가 적용된다.

 

 

JSON 만들기(Object 형태로 만드는 경우)

자바의 Object, Array 개념을 숙지했다는 가정에서 설명한다.

 

JSON은 key와 value값으로 필요한 값을 저장해둔 map구조와 Array구조가 결합되어 저장된 방식이라고 생각하면 된다.

이 표현식은 사람도 이해하기 쉽고 기계도 이해하기 쉬운데다가 데이터 용량도 작다. 이런 이유로 최근에는 JSON이 XML을 대체해서 설정의 저장이나 데이터를 전송등에 많이 사용된다.

 

JSONObject

   - 기본구조 : {String name : Value, String name2 : Value2 ...}

 

JSONArray

   - 기본구조 : [{String name : Value}, {String name2 : Value2} ...]



다음은 Array와 Object가 결합된 형태의 JSON 예시이다.

{
    "회원정보":[
        {"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},
        {"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}
    ]
    "음식정보":[
        {"name":"떡볶이","price":"3000"},
        {"name":"마라탕","price":5000"}
    ]
}

여기서 음식정보에 대한 정보만 골라서 파싱하거나, id가 "min0320"인 회원의 "name"을 출력하는 등 여러가지 방법으로 원하는 값을 부분적으로 골라낼 수 있다.

 

먼저 회원정보 값을 JSON으로 만들어보자.

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class DataJson{
	DataJson(){
		JSONObject parent = new JSONObject();
		JSONArray childrens = new JSONArray();
		
		JSONObject child = new JSONObject();
		child.put("id", "min0320");
		child.put("password", "1234");
		child.put("name", "홍길동");
		child.put("phone", "01012345678");
		childrens.add(child);
		
		JSONObject child2 = new JSONObject();
		child2.put("id", "hun5327");
		child2.put("password", "1234");
		child2.put("name", "장길산");
		child2.put("phone", "01023456789");
		childrens.add(child2);
		
		parent.put("회원정보", childrens);
		
		System.out.println(parent.toString());
	}
	public static void main(String[] args) {
		DataJson data = new DataJson();
	}
}
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class DataJson{
	DataJson(){
		JSONObject parent = new JSONObject();
		JSONArray childrens = new JSONArray();

JSONObject을 통해 필요한 값을 map형태로 담도록 하고,

JSONArray를 통해 map으로 담은 값들을 배열 형태로 담을 수 있도록 한다.

JSONObject child = new JSONObject();
		child.put("id", "min0320");
		child.put("password", "1234");
		child.put("name", "홍길동");
		child.put("phone", "01012345678");
		childrens.add(child);

JSONObject 객체 이름으로 child를 선언해서 홍길동에 대한 여러 정보들을 담도록 했다.

Object에 값을 추가하기 위해서는 put메서드를 사용해야 한다.

값을 다 담았으면 childrens (JSONArray 객체)에 Object들을 담는다.

Array에 값을 추가하기 위해서는 add메서드를 사용해야 한다.

 

이렇게 되면 childrens라는 Array객체의 첫번째 인덱스 값에는 홍길동의 회원정보에 대한 데이터가 하위정보로 저장된다.

 

이클립스 사용시에 제네릭스 사용 관련으로 글자에 빨간줄이 그어지기도 하는데 실행은 잘 될 것이다.

JSONObject, JSONArray 클래스를 사용하는 경우 제네릭스 지원이 되지 않아서 무시해도 된다.

 

JSONObject child2 = new JSONObject();
		child2.put("id", "hun5327");
		child2.put("password", "1234");
		child2.put("name", "장길산");
		child2.put("phone", "01023456789");
		childrens.add(child2);
		
		parent.put("회원정보", childrens);

같은 방법으로 장길산의 회원정보를 chidrens 객체 배열에 추가해보자.

childrens Array객체의 두번째 인덱스 값에는 장길산의 회원정보에 대한 데이터가 하위정보로 추가된다.

 

이 모든 정보를 value값으로 하고, key값을 "회원정보"로 지정하기 위해 JSONObject로 선언된 parent에 childrens Array객체를 추가해주었다.

child와 마찬가지로 Object이므로 값을 추가할 때는 put 메서드를 이용했다.

 

System.out.println(parent.toString());

이제 이 값을 문자열로 형변환하여 터미널에 출력하면 회원정보에 대한 전체 JSON 데이터가 나타날 것이다.

{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}]}

 

object로 값을 mapping하고 Array로 그 값을 배열 형태로 정리하고, 다시 그 값을 object로 mapping하는 것을 반복하면 더 복잡한 JSON을 구현할 수 있다.

 

위의 방법을 활용해 이번에는 음식정보도 parent에 추가해보자.

 

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class DataJson{
	DataJson(){
		JSONObject parent = new JSONObject();
		JSONArray childrens = new JSONArray();
		
		JSONObject child = new JSONObject();
		child.put("id", "min0320");
		child.put("password", "1234");
		child.put("name", "홍길동");
		child.put("phone", "01012345678");
		childrens.add(child);
		
		JSONObject child2 = new JSONObject();
		child2.put("id", "hun5327");
		child2.put("password", "1234");
		child2.put("name", "장길산");
		child2.put("phone", "01023456789");
		childrens.add(child2);
		
		parent.put("회원정보", childrens);
		
		
		JSONArray foodArr = new JSONArray();
		JSONObject food = new JSONObject();
		food.put("name", "떡볶이");
		food.put("price", "3000");
		foodArr.add(food);
		
		JSONObject food2 = new JSONObject();
		food2.put("name", "마라탕");
		food2.put("price", "5000");
		foodArr.add(food);
		
		parent.put("음식정보", foodArr);
		
		System.out.println(parent.toString());	
	}
	public static void main(String[] args) {
		DataJson data = new DataJson();
	}
}
{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}],
"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

 

JSON 키 값 제거

가장 바깥은 map구조로, 그 안은 Array구조로, 제일 안쪽은 또 map구조로 되어있기 때문에 값을 지울 부분마다 지우는 방법이 다르다.

 

먼저 위의 코드를 다음과 같은 형태로 수정했다.

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class DataJson{
	JSONObject parent = new JSONObject();  // parent를 멤버변수로 초기화
	DataJson() {  // DataJson 객체 생성시 한번 호출될 생성자
		
		JSONArray childrens = new JSONArray();
		
		JSONObject child = new JSONObject();
		child.put("id", "min0320");
		child.put("password", "1234");
		child.put("name", "홍길동");
		child.put("phone", "01012345678");
		childrens.add(child);
		
		JSONObject child2 = new JSONObject();
		child2.put("id", "hun5327");
		child2.put("password", "1234");
		child2.put("name", "장길산");
		child2.put("phone", "01023456789");
		childrens.add(child2);
		
		parent.put("회원정보", childrens);
		
		
		JSONArray foodArr = new JSONArray();
		JSONObject food = new JSONObject();
		food.put("name", "떡볶이");
		food.put("price", "3000");
		foodArr.add(food);
		
		JSONObject food2 = new JSONObject();
		food2.put("name", "마라탕");
		food2.put("price", "5000");
		foodArr.add(food);
		
		parent.put("음식정보", foodArr);
		
	}
	void DataPrint() {    // parent값을 String형태로 형변환해서 터미널에 출력하는 멤버함수
		System.out.println(parent.toString());
	}
		
	public static void main(String[] args) {
		DataJson data = new DataJson();
		data.DataPrint();
	}
}
{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}],
"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

 

만약 여기서 "음식정보"에 해당하는 데이터를 제거하려면 map구조이기 때문에 remove메서드를 사용해야 한다.

 

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class DataJson{
	JSONObject parent = new JSONObject();  // parent를 멤버변수로 초기화
	DataJson() {  // DataJson 객체 생성시 한번 호출될 생성자
		
		JSONArray childrens = new JSONArray();
		
		JSONObject child = new JSONObject();
		child.put("id", "min0320");
		child.put("password", "1234");
		child.put("name", "홍길동");
		child.put("phone", "01012345678");
		childrens.add(child);
		
		JSONObject child2 = new JSONObject();
		child2.put("id", "hun5327");
		child2.put("password", "1234");
		child2.put("name", "장길산");
		child2.put("phone", "01023456789");
		childrens.add(child2);
		
		parent.put("회원정보", childrens);
		
		
		JSONArray foodArr = new JSONArray();
		JSONObject food = new JSONObject();
		food.put("name", "떡볶이");
		food.put("price", "3000");
		foodArr.add(food);
		
		JSONObject food2 = new JSONObject();
		food2.put("name", "마라탕");
		food2.put("price", "5000");
		foodArr.add(food);
		
		parent.put("음식정보", foodArr);
		
        
        //추가된 부분
        parent.remove("음식정보");
        //추가된 부분
	}
	void DataPrint() {    // parent값을 String형태로 형변환해서 터미널에 출력하는 멤버함수
		System.out.println(parent.toString());
	}
		
	public static void main(String[] args) {
		DataJson data = new DataJson();
		data.DataPrint();
	}
}
{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}]}

음식정보에 해당하는 데이터가 통째로 날아가 버리고 회원정보에 해당하는 데이터만 출력되었다.

 

JSON 특정 키값 파싱1

이번에는 데이터를 날리지 않고 "회원정보"에 들어있는 값들만 출력하도록 만들어보자.

 

import org.json.simple.JSONArray;
import org.json.simple.JSONObject;

public class DataJson{
	JSONObject parent = new JSONObject();
	DataJson() {
		
		JSONArray childrens = new JSONArray();
		
		JSONObject child = new JSONObject();
		child.put("id", "min0320");
		child.put("password", "1234");
		child.put("name", "홍길동");
		child.put("phone", "01012345678");
		childrens.add(child);
		
		JSONObject child2 = new JSONObject();
		child2.put("id", "hun5327");
		child2.put("password", "1234");
		child2.put("name", "장길산");
		child2.put("phone", "01023456789");
		childrens.add(child2);
		
		parent.put("회원정보", childrens);
		
		
		JSONArray foodArr = new JSONArray();
		JSONObject food = new JSONObject();
		food.put("name", "떡볶이");
		food.put("price", "3000");
		foodArr.add(food);
		
		JSONObject food2 = new JSONObject();
		food2.put("name", "마라탕");
		food2.put("price", "5000");
		foodArr.add(food);
		
		parent.put("음식정보", foodArr);
		
	}
	void DataPrint() {
		System.out.println(parent.toString());
	}
		
	public static void main(String[] args) {
		DataJson data = new DataJson();
		// 변경된 부분 [
		JSONArray accountArr = (JSONArray)data.parent.get("회원정보");
		System.out.println(accountArr);
		// 변경된 부분 ]
	}
}
[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}]
		JSONArray accountArr = (JSONArray)data.parent.get("회원정보");
		System.out.println(accountArr);

"회원정보" 는 mapping되어있는 값이므로 get메서드를 사용해 특정 키값을 받아올 수 있다.

예제의 경우 그 value에 해당하는 값이 Array형태로 저장되어 있으므로 저장된 모든 값을 할당하는 변수또한 JSONArray 형태로 선언되어야 한다.

 

JSON 특정 키값 파싱2

그럼 불러온 배열 안에 있는 특정 키의 값들을 파싱하려면 어떻게 해야할까?

예를들어 위에서 불러온 배열들 중에서 name키에 해당하는 모든 값들을 출력해보자.

(...)
	public static void main(String[] args) {
		DataJson data = new DataJson();
        
		JSONArray accountArr = (JSONArray)data.parent.get("회원정보");
		for(int i = 0; i < accountArr.size(); i++) {
			JSONObject obj = (JSONObject)accountArr.get(i);
			System.out.println((String)obj.get("name"));
		}
		
	}
}
홍길동
장길산

배열 내부의 데이터들이 mapping 되어있기 때문에 이번에도 JSONObject 형태로 각각의 배열들의 인덱스 값을 할당받아야 한다.

0번째 배열 값은 홍길동에 대한 회원정보가, 1번째 배열 값에는 장길산에 대한 회원정보가 mapping되어 있으므로 반복문을 돌 때마다 각 object의 "name" key에 해당하는 value값을 String으로 형변환하여 출력하도록 한다.

 

Object와 Array를 번갈아가면서 JSON을 쌓아올린 것과 마찬가지로, JSON의 값을 해체할때도 역순으로 번갈아가며 진행하면 된다.

 

 

JSON 특정 키 이름을 변경하기

"회원정보"에 들어있는 하위 key들 중에서 특정 key 이름을 변경하고자 한다.

예를들면 "phone"이라는 key 이름을 "phoneNumber"로 바꾸려면 어떻게 해야할까?

(...)
    public static void main(String[] args) {
		DataJson data = new DataJson();
		data.DataPrint();
        
		JSONArray accountArr = (JSONArray)data.parent.get("회원정보");

		for(int i = 0; i < accountArr.size(); i++) {
			JSONObject obj = (JSONObject)accountArr.get(i);
			obj.put("phoneNumber", obj.get("phone"));
			obj.remove("phone");
		}
        
		data.DataPrint();
	}
}
바꾸기 전 :
{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}],
"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

바꾼 후 :
{"회원정보":[{"password":"1234","phoneNumber":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phoneNumber":"01023456789","name":"장길산","id":"hun5327"}],
"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

 

JSONArray accountArr = (JSONArray)data.parent.get("회원정보");

		for(int i = 0; i < accountArr.size(); i++) {
			JSONObject obj = (JSONObject)accountArr.get(i);
			obj.put("phoneNumber", obj.get("phone"));
			obj.remove("phone");
		}

"회원정보"내의 값들이 Array형태로 저장되어 있으므로 JSONArray 형태로 회원정보의 값들을 할당 받았다.

그리고 배열의 각 인덱스를 순회하면서 내부의 mapping된 값을 JSONObject 형태로 할당받는다.

obj.put("바꾸려는 키 이름",  obj.get("기존의 키 이름"));

obj.remove("기존의 키 이름");

이 방법을 활용해 기존에 저장된 내부의 키 이름을 변경할 수 있다.

 

json - How to rename key in JSONObject using java? - Stack Overflow

 

How to rename key in JSONObject using java?

I want to rename the keys of a JSON object using Java. My input JSON is: { "serviceCentreLon":73.003742, "type":"servicecentre", "serviceCentreLat":19.121737, "clientId":"NMMC01...

stackoverflow.com

 

자바에서 Map의 데이터를 다루는 여러가지 방법은 아래를 참고.

03-08 맵 (Map) - 점프 투 자바 (wikidocs.net)

 

03-08 맵 (Map)

사람을 예로 들면 누구든지 이름 = 홍길동, 생일 = 몇 월 며칠 등으로 구분할 수 있다. 자바의 **맵(Map)**은 이러한 대응관계를 쉽게 표현할 수 ...

wikidocs.net

 

JSON 특정 키 값 변경하기

회원정보의 데이터들 중에 id가 hun5327인 회원의 password값을 5678로 바꾸는 예시이다.

(...)
   public static void main(String[] args) {
            DataJson data = new DataJson();
            data.DataPrint();

            JSONArray accountArr = (JSONArray)data.parent.get("회원정보");

            for(int i = 0; i < accountArr.size(); i++) {
                JSONObject obj = (JSONObject)accountArr.get(i);
                if (obj.get("id").equals("hun5327")){
                        obj.put("password", "5678");
                }
            }
            data.DataPrint();
        }
    }
변경 전
{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}],
"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

변경 후
{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"5678","phone":"01023456789","name":"장길산","id":"hun5327"}],
"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

put(바꿀값의 키, 바꿀 값); 으로 간단하게 value를 변경할 수 있다.

 

 

JSON 파일 저장하기

생성한 JSON 오브젝트를 외부에서 객체로 생성한다고 가정해보자.

JSON을 A와 B라는 객체로 생성하고, A에서는 "회원정보"에 해당하는 데이터를 지워버리고 B는 가만히 내버려 두었다.

(...)
    public static void main(String[] args) throws ParseException {
		DataJson data = new DataJson();
		data.parent.remove("회원정보");

		data.DataPrint();
		
		DataJson data2 = new DataJson();
		data2.DataPrint();
	}
}
data객체 출력 결과
{"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

data2객체 출력 결과
{"회원정보":[{"password":"1234","phone":"01012345678","name":"홍길동","id":"min0320"},{"password":"1234","phone":"01023456789","name":"장길산","id":"hun5327"}],
"음식정보":[{"price":"3000","name":"떡볶이"},{"price":"3000","name":"떡볶이"}]}

당연히 A에서 수정한 결과가 B 객체에는 영향을 주지 못한다.

애초에 다른 객체로 생성되었기 때문에 각 객체의 Heap 영역이 다르게 지정되었기 때문이다.

 

JSON 파일을 생성하여 읽고 쓰는 방식을 이용하면 이런 문제를 어느정도 해결할 수 있다. 물론 가장 확실한 방법은 서버에서 데이터베이스를 공유하는 것이다...

 

JAVA 자바 JSON 파일 쓰기/읽기 (한글 깨짐 인코딩 문제 해결법) (tistory.com)

 

JAVA 자바 JSON 파일 쓰기/읽기 (한글 깨짐 인코딩 문제 해결법)

JAVA 자바 JSON 파일 쓰기/읽기 (한글 깨짐 인코딩 문제 해결법) 자바 JSON 만들기, 추가, 제거, 파싱하는 법과 예제(수정) (tistory.com) 자바 JSON 만들기, 추가, 제거, 파싱하는 법과 예제(수정) 자

afterdawncoding.tistory.com

 

728x90