Json형식을 전달 받을 때는
{k:v, k:v}
[{k:v},{k:v},{k:v}}]
{k=[{k:v},{k:v}]}
경우에 따라 파싱하는 방식이 다르기 때문에 유의해야 한다.
JSON 파싱을 위한 라이브러리로 gson과 jackson, moshi 등이 있는데, 적은 데이터로는 gson이 성능이 더 좋다고 한다.
https://mvnrepository.com/artifact/com.google.code.gson/gson
에서 원하는 버전의 gson .jar 파일을 다운 받아
인텔리제이 파일 -> 프로젝트구조 -> 라이브러리 에 추가한다.
안드는 그냥 dependency 추가해주면 되는데ㅎ..ㅎ
나는 과제에서 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" +
" }";
//내가 사고싶은 옷들 넣기
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() 함수를 오버라이딩하였다
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형식으로 만들었다.
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형식으로 파싱해준뒤, 다시 리스트를 정렬하여 출력하였다.
가격이 높은 순으로 잘 정렬된 것을 볼 수 있다! 끝!