[JAVA] Json 라이브러리로 json 파싱하기

merci·2023년 1월 8일
0

JAVA

목록 보기
5/10

웹상에서 데이터를 주고 받을때 공통된 오브젝트를 사용한다면 서로가 한번만 변환을 해서 데이터를 사용할 수가 있다 ( 여러번 변환할 필요가 없다 ! )
( 이해하기 쉽게 말하자면 다양한 언어를 배우지말고 영어 하나만 공용어로 사용하자 )
이러한 오브젝트중에서 json 오브젝트를 파싱하는 방법에 대해 알아보자

Json (JavaScript Object Notation)

  • json 오브젝트 - 자바스크립트의 객체 표기법으로부터 파생된 부분 집합
  • json 에는 객체 오브젝트와 배열 오브젝트가 저장되어 있다.


( 본 포스팅에서 사용하는 URI주소들에는 아래와 같은 json파일들이 있다 )

`{"code":1,"msg":"목록보기완료","data":[{"id":2,"username":"cos","password":"","email":"cos@nate.com","created":"2023-01-08 13:42:07","updated":"2023-01-08 13:42:07"},{"id":1,"username":"ssar","password":"","email":"ssar@nate.com","created":"2023-01-08 13:42:07","updated":"2023-01-08 13:42:07"}]}`
  • json viewer를 이용하면 -> http://jsonviewer.stack.hu/
    json 의 구조를 시각화해 볼 수 있다
    { 중괄호 } - 객체 오브젝트
    [ 대괄호 ] - 배열 오브젝트


json 파싱하기

먼저 파싱에 사용할 라이브러리를 build.gradle 에 추가

 implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9'
 compileOnly group: 'org.projectlombok', name: 'lombok', version: '1.18.22'
// json의 데이터를 입력받을 클래스를 먼저 만든다
import java.util.ArrayList;

public class Response {
    private int code;
    private String msg;
    private ArrayList<User> data;

    public int getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
    public ArrayList<User> getData() {
        return data;
    }
    public class User {
        private int id;
        private String username;
        private String password;
        private String email;
        private String created;
        private String updated;

        public int getId() {
            return id;
        }
        public String getUsername() {
            return username;
        }
        public String getPassword() {
            return password;
        }
        public String getEmail() {
            return email;
        }
        public String getCreated() {
            return created;
        }
        public String getUpdated() {
            return updated;
        }
    }
}


// main 메소드에서 json파일을 클래스 객체로 파싱
public static void main(String[] args) {
        try {
            URL url = new URL("http://localhost:8080/init/user"); 
            HttpURLConnection stream = (HttpURLConnection) url.openConnection();
            BufferedReader buf = new BufferedReader(
            new InputStreamReader(stream.getInputStream()));
            		// 스트림을 통해 json을 버퍼에 저장
            String result = "";
            String str;
            while ((str = buf.readLine()) != null) {
                // System.out.println(str);  	//  json 을 콘솔에 출력
                result = result + str; // json의 내용을 String타입으로 저장
            }
            buf.close();
            
         Gson gson = new Gson();		// gson 라이브러리 이용
            Response response = gson.fromJson(result, Response.class);
            			// json의 데이터를 입력받은 Response 객체가 힙영역에 생성됨
            System.out.println(response.getCode());
            System.out.println(response.getMsg() + "\n");

            ArrayList<User> data = response.getData();
            for (User user : data) {
                System.out.println(user.getId());
                System.out.println(user.getUsername());
                System.out.println(user.getEmail());
                System.out.println("--------------");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

결과는

1
목록보기완료

2
cos
cos@nate.com
--------------
1
ssar
ssar@nate.com
--------------

클래스를 만들때의 주의점은 json 의 변수이름과 동일한 변수이름으로 만들어야한다.
기본형 타입이 아니면 클래스나 리스트 타입으로 필드를 생성한다.

  • 이번에는 메소드로 json을 String 문자열로 리턴하는 기능을 구현 ( 기능 분리 - 모듈화 )
// URLtoString 메소드 생성
package myUtil;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class MyUtil  {
    public static String URLtoString(String str) throws Exception {
        URL url = new URL(str);
        HttpURLConnection stream = (HttpURLConnection) url.openConnection();
        String result = "";
        try ( BufferedReader buf = new BufferedReader(
        new InputStreamReader(stream.getInputStream()))) {
        String string;
        while ((string = buf.readLine()) != null) {
            result += string;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
        return result;
    }
}
// json 데이터를 받을 클래스 생성
import java.util.ArrayList;

import lombok.Getter;

@Getter
public class First {
    private int code;
    private String msg;
    public ArrayList<Second> data;

    public class Second {
        private int id;
        private String title;
        private String content;
        private String created;
        private String updated;
        private Third user;

        @Override
        public String toString() {
            return "\n" + String.valueOf(id) + "\n" + title + "\n" + content + "\n"
                    + user;
        }
    }

    class Third {
        private String created;
        private String updated;

        @Override
        public String toString() {
            return "\n" + updated + "\n";
        }
    }
}
// main 실행
import com.google.gson.Gson;

import myUtil.MyUtil; // URLtoString 메소드 호출

public class BufferEx001 {
    public static void main(String[] args) {
        try {
            String str = MyUtil.URLtoString("http://localhost:8080/init/post");
            First fir = new Gson().fromJson(str, First.class);
            System.out.println(fir.getData());
            		// toString 재정의해서 데이터 몇개만 출력했음
        } catch (Exception e) {
            e.getStackTrace();
        }
    }
}

결과는

[
5
제목5
내용5

2023-42-08T13:42:07
,
4
제목4
내용4

2023-42-08T13:42:07
,
3
제목3
내용3

2023-42-08T13:42:07
,
2
제목2
내용2

2023-42-08T13:42:07
,
1
제목1
내용1

2023-42-08T13:42:07
]


  • 이번에는 배열 오브젝트를 파싱해보자
// URLtoString 메소드는 생략하겠다 위에 코드를 참고
// 클래스는 생략했다. 
// 자동으로 만들어주는 사이트도 있는데 그 전에 직접 만드는데 익숙해지자.
// https://jsonplaceholder.typicode.com/users 주소를 이용했다. 여러분도 따라 해보자.
import java.util.Arrays;
import java.util.List;

import com.google.gson.Gson;

import myUtil.MyUtil;

public class SecondJson {
    public static void main(String[] args) {
        try {
            String str =  MyUtil.URLtoString(
            "https://jsonplaceholder.typicode.com/users");
            Gson gson = new Gson();
           Root[] root = gson.fromJson(str, Root[].class);  // 배열 오브젝트
           List<Root> list2 = Arrays.asList(root);  
           System.out.println(list2);  // toString 재정의로 모두 출력하게 했음
        } catch (Exception e) {
            e.getStackTrace();
        }
    }
}

결과는

[
id : 1
Leanne Graham
Bret
Sincere@april.biz
1-770-736-8031 x56442
hildegard.org

  < Address > 
Kulas Light
Apt. 556
Gwenborough
92998-3874

 < Geo >  
lat : -37.3159
lng : 81.1496

  < Company > 
Company Name : Romaguera-Crona
Company catchPhrase : Multi-layered client-server neural-net
Company bs : harness real-time e-markets
---------------------------------, 
id : 2
Ervin Howell
Antonette
Shanna@melissa.tv
010-692-6593 x09125
anastasia.net

  < Address > 
Victor Plains
Suite 879
Wisokyburgh
90566-7771

 < Geo >  
lat : -43.9509
lng : -34.4618

  < Company > 
Company Name : Deckow-Crist
Company catchPhrase : Proactive didactic contingency
Company bs : synergize scalable supply-chains
---------------------------------, 
// ( id는 10까지 이하 생략 )
profile
작은것부터

0개의 댓글