전에는 간단한 json형식을 파싱하였다. 이번엔 좀 더 복잡한 형식을 파싱해보자.
String json2 = "{\"memberInfo\" : [{\"name\": \"Messi\", \"email\" : \"test@test.com\", \"age\" : 20}, " +
"{\"name\": \"Rhonaldo\", \"email\" : \"test2@test.com\", \"age\" : 25}]}";
위의 json문자열을 파싱해보도록 하자. 구조를 자세히 보면
{key0 : [ { key1 : value1 , key2 : value2, ...}, { key3 : value3 , key4 : value4, ...} ] }
이렇게 파악이 된다. 즉, key0의 값이 대괄호('[]')로 묶어져 있다. 또, 대괄호 안에는 중괄호('{}')로 묶여진 것이 2개가 있다. 뭔가 복잡해 보여서 파싱하기가 겁이 났었지만 처음부터 하나하나 뜯어나가면 된다.
가장 바깥쪽이 중괄호로 묶어져 있기 때문에, 아래와 같이 주어진 문자열 json2를 JsonObject로 변환하는 작업을 한다.
JsonElement element = JsonParser.parseString(json2);
JsonObject object = element.getAsJsonObject();
그 후 key0의 값을 처리하는 작업을 한다. key0의 값은 대괄호로 묶어져 있는데, 이런 경우는 아래와 같이 JsonArray로 값을 받으면 된다.
JsonArray array = object.get("memberInfo").getAsJsonArray();
step2에서 JsonArray를 받은 값을 처리하기 위해서는, 일반 배열과 동일하게 아래와 같이 반복문을 사용하면 된다. JsonArray 내에 있는 element들이 전에 정리한 간단한 {키:값, 키:값, ..}와 같은 json형식이기 때문에 gson.fromJson을 이용하여 쉽게 처리할 수 있다.
Gson gson = new Gson();
for (int i = 0; i < array.size(); i++) {
JsonObject memberInfo = array.get(i).getAsJsonObject();
Member member = gson.fromJson(memberInfo, Member.class);
System.out.println(member.name);
System.out.println(member.email);
System.out.println(member.age);
}
class Member{
String name;
String email;
int age;
}
//출력결과
//Messi
//test@test.com
//20
//Rhonaldo
//test2@test.com
//25
앞으로 json문자열을 만나면 구조를 잘 파악해서(구조를 파악해주는 tool도 있다고 한다.) JsonObject, JsonArray, gson 등을 잘 섞어쓰면 파싱할 수 있을 듯 하다.