본문 바로가기
IT/Java

[JAVA] 다양한 형태의 JSON 파일 파싱하기 JSONParser, JSONObject, JSONArray (json.simple, GSON)

by 스터딩아재 2021. 11. 30.
반응형

 

JSON 파일을 땡겨왔는데 이를 저장하기 위해선 JSON 데이터를 사용하기 위해 JSONObject와 JSONArray를 쓸 수 있습니다. json-simple을 통해 json 객체를 다루는 법을 알아보겠습니다. 본 글에는 없지만 jackson이나 GSON도 기본적으로 사용법은 유사합니다.

 

 

JSON-Simple

 

json-simple 라이브러리는 JSON 파싱을 지원합니다.  

.java 파일에서 JSONObject jsonObj = new JSONObject(); 를 입력하고 컨트롤+시프트+O를 누르면 import 가능한 관련 라이브러리가 나올 것입니다.

거기서 org.json.simple.JSONObject가 나온다면 추가해주시고, 없으면 pom.xml에 dependency를 아래처럼 추가해줍니다.

MAVEN 환경이 아니라면 jar파일 구해서 add .jar 하셔야 하는데 아마 다 있으실 겁니다.

 

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

 

 

JSON Parser

 

json 데이터가 이미 "[{a,b,c},{d,e,f}]"와 같이 String으로 가지고 있거나,

.json 파일에서 Reader를 통해 텍스트를 읽어 들이는 방법입니다.

 

import java.io.FileReader;
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;

public class jsonFileRead{
    public static void main(String[] args) throws IOException {
        // json형태의 string일 경우
        String jsonData = "{\"param1\":\"111\",\"param2\":\"222\"}"
        // reader를 Object로 parse
        JSONParser parser = new JSONParser();
        Object obj = parser.parse(jsonData); 
        
        // .json 파일일 경우
        Reader reader = new FileReader("File Path");
        // reader를 Object로 parse
        JSONParser parser = new JSONParser();
        Object obj = parser.parse(reader); 
        
        // 아래 code로 이어짐
    }
}

 

위 절차를 통해 file을 Object로 만드는게 우선입니다.

이제 .json 파일의 형식에 따라 조금씩 다릅니다. Object와 Array에 대해 곰곰이 생각해보면 쉬우니 하나씩 보시면 금방 이해되실 겁니다.

 


 

JSON객체 단건 일때 (JSONObject)

{"name":"StudyingAzae","job":"Gamer","age":"3"}

 

파일에서 읽은 값이 위와 같은 단건의 json객체라면 바로 JSONObject에 담으면 됩니다. 

// 상단 코드에 이어 

// obj를 JsonObject로 cast
JSONObject jsonObj = (JSONObject)obj;

System.out.println((String)jsonObj.get("name"));  // StudyingAzae 출력

 

JSONObject에서 get한 뒤에는 .toString()도 가능하지만, 이는 값이 null일때 에러가 나기 때문에 nvl이나 null 체크를 넣던지 (Stirng)으로 캐스팅하는 것이 좋습니다.

 


 

다건 JSON객체 일때 (JSONArray)

[{"name":"StudyingAzae","job":"Gamer","age":"3"},{"name":"Soodal","job":"Wife","age":"2"}]

 

파일에서 읽은 값이 위와 같은 다건의 json객체라면 JSONArray에 담았다가 JSONObject로 담습니다.

// 상단 코드에 이어 

// obj를 JsonArray로 cast
JSONArray jsonArr = (JSONArray)obj;

// jsonArr에서 하나씩 JSONObject로 cast해서 사용
if (jsonArr.size() > 0){
    for(int i=0; i<jsonArr.size(); i++){
        JSONObject jsonObj = (JSONObject)jsonArray.get(i);
        
        System.out.println((String)jsonObj.get("name")); 
    }
    // StudyingAzae, Soodal 출력
}

 


 

다건 JSON객체가 JSON 내부에 있을때

{

"day":"20211130",

"user":[{"name":"StudyingAzae","job":"Gamer","age":"3"},{"name":"Soodal","job":"Wife","age":"2"}]
}

 

파일에서 읽은 값이 위와 같이 json안에 있는 array라면 위의 jsonObject와 jsonArray를 반복 사용하면 됩니다.

읽어보면 별거 없습니다.

// 상단 코드에 이어 

// obj를 우선 JSONObject에 담음
JSONObject jsonMain = (JSONObject)obj;

// jsonObject에서 jsonArray를 get함
JSONArray jsonArr = (JSONArray)jsonMain.get("user");

// jsonArr에서 하나씩 JSONObject로 cast해서 사용
if (jsonArr.size() > 0){
    for(int i=0; i<jsonArr.size(); i++){
        JSONObject jsonObj = (JSONObject)jsonArray.get(i);
        
        System.out.println((String)jsonObj.get("name")); 
    }
    // StudyingAzae, Soodal 출력
}

 


 

만약 json 다건 중에 또 json 다건이 포함된 파일이면, jsonArray로 담아서 반복문을 통해 다시 jsonArray를 꺼내면 될 것입니다.

 

이 예제는 굳이 안 써도 충분히 응용 가능하실 겁니다.(혹시 감이 안 오시면 비밀 댓글 달아주시면 보겠습니다)

 

 

JSON 파일 읽기

그리드형

댓글