[JAVA] GSON으로 json 파싱하기

김민주·2022년 11월 23일
0

java

목록 보기
1/2

인텔리제이에서 GSON 라이브러리로 JSON 파싱하기!



JSON 형식 종류


Json형식을 전달 받을 때는

  1. JsonObject {k:v, k:v}
  2. JsonArray [{k:v},{k:v},{k:v}}]
  3. JsonObject 속의 JsonArray {k=[{k:v},{k:v}]}

경우에 따라 파싱하는 방식이 다르기 때문에 유의해야 한다.



Gson

JSON 파싱을 위한 라이브러리로 gson과 jackson, moshi 등이 있는데, 적은 데이터로는 gson이 성능이 더 좋다고 한다.

https://mvnrepository.com/artifact/com.google.code.gson/gson

에서 원하는 버전의 gson .jar 파일을 다운 받아

인텔리제이 파일 -> 프로젝트구조 -> 라이브러리 에 추가한다.

안드는 그냥 dependency 추가해주면 되는데ㅎ..ㅎ



DTO

나는 과제에서 JsonObject 속 JsonArray를 파싱해야 했기 때문에

  "{\n" +
                "       \"items\": [\n" +
                "         {\n" +
                "           \"label\": \"글로니 니트 투피스\",\n" +
                "           \"price\": 170000\n" +
                "         },\n" +
                "         {\n" +
                "           \"label\": \"그로브 맨투맨\",\n" +
                "           \"price\": 70000\n" +
                "         },\n" +
                "         {\n" +
                "           \"label\": \"연아다운 패딩\",\n" +
                "           \"price\": 220000\n" +
                "         }\n" +
                "       ]\n" +
                "   }"; 
//내가 사고싶은 옷들 넣기

  1. label과 price를 담을 DTO를 만들고,
  2. JsonObject인 items을 담을 DTO도 만들었다.



  • Clothing.java
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Clothing implements Comparable<Clothing>{

    @SerializedName("label")
    @Expose
    private String label;
    @SerializedName("price")
    @Expose
    private int price;

    public Clothing( String label, int price){
        this.label = label;
        this.price = price;
    }
    public String getLabel(){
        return label;
    }

    public int getPrice(){
        return price;
    }

    //price 내림차순 정렬 -> Comparable<Clothing> interface 구현
    @Override
    public int compareTo(Clothing o) {
        if (this.price == o.price){
            return 0;
        } else if (this.price > o.price) {
            return -1;
        }else {
            return 1;
        }
    }
}

그냥 쓰면 아래 사진처럼 Clothing의 Comparable을 구현하라고 하기때문에

compareTo()함수가 비교값이 더 크면 원래 -1을 반환하기때문에
가격 내림차순 정렬을 위해서 compareTo() 함수를 오버라이딩하였다



  • ClothingData.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;

public class ClothingData {

    @SerializedName("items")
    @Expose
    private List<Clothing> items;


    public ClothingData(){    }
    public ClothingData(List<Clothing> items){
        this.items = items;
    }

    public List<Clothing> getItems() {
        return items;
    }

}

Clothing 클래스를 가지는 LIST형식으로 만들었다.



JSON Parsing

  • Main.java
import com.google.gson.Gson;
import java.util.*;

public class Main {
    private static Gson gson;
    private static ClothingData clothingData;
    public static synchronized Gson getInstance() {
        if (gson == null) gson = new Gson();
        return gson;
    }

    public static void main(String[] args) {

        String s =   "{\n" +
                "       \"items\": [\n" +
                "         {\n" +
                "           \"label\": \"글로니 니트 투피스\",\n" +
                "           \"price\": 170000\n" +
                "         },\n" +
                "         {\n" +
                "           \"label\": \"그로브 맨투맨\",\n" +
                "           \"price\": 70000\n" +
                "         },\n" +
                "         {\n" +
                "           \"label\": \"연아다운 패딩\",\n" +
                "           \"price\": 220000\n" +
                "         }\n" +
                "       ]\n" +
                "   }";

        //Gson: items parsing
        clothingData = getInstance().fromJson(s, ClothingData.class);
        List<Clothing> clothingList = new ArrayList<>();

        for (int i = 0; i < clothingData.getItems().size(); i++) {
            clothingList.add(clothingData.getItems().get(i));
        }
        List<Clothing> sortList = sortListByPrice(clothingList);

        for(Clothing i : sortList){
            System.out.println("LABEL: " + i.getLabel() + " PRICE: " + i.getPrice());
        }
    }

    private static List<Clothing> sortListByPrice(List<Clothing> list) {
        Collections.sort(list);
        return list;
    }
}

Singleton 으로 gson을 생성해주고, fromJson객체를 이용해 ClothingData형식으로 파싱해준뒤, 다시 리스트를 정렬하여 출력하였다.

가격이 높은 순으로 잘 정렬된 것을 볼 수 있다! 끝!

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글