GSON을 사용하여 JSON 배열 구문 분석


110

다음과 같은 JSON 파일이 있습니다.

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

파일에 루트 요소가있을 때 이전에는 다음을 사용합니다.

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

코드를 작성하는 방법을 생각할 수 없습니다. Wrapper 루트 요소가 배열이므로 클래스 .

나는 사용을 시도했다 :

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

와:

public class Wrapper{

    String number;
    String title;

}

그러나 운이 없었습니다. 이 방법을 사용하여 어떻게 읽을 수 있습니까?

추신 : 나는 이것을 사용하여 작동했습니다.

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

그러나 가능한 경우 두 가지 방법으로 수행하는 방법을 알고 싶습니다.


4
제목 요소 뒤에 쉼표가 있습니까? 제거하면 Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);잘 작동합니다.
Pshemo

1
그게 문제 야 .. 그런 간단한 실수!
Eduardo

답변:


112

문제는 배열에 배치 된 JSON 객체 (귀하의 경우 ) 끝에있는 쉼표로 인해 발생합니다 .

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

그들을 제거하면 데이터가

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

잘 작동합니다.


1
@Snake는 Google Gson을
Pshemo

1
@Snake BTW, jackson라이브러리 및 이 주석의 경우 배열을 만들고 래핑하는 것이 Arrays.asList(..)TypeRefence를 사용하여 목록을 만드는 것보다 빠릅니다. gson라이브러리로 테스트하지는 않았지만 벤치마킹 할 가치가 있습니다.
Pshemo

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

잘 작동하는 것 같습니다. 그러나 ,문자열에 추가 쉼표가 있습니다.

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

샘플 호출 :

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
나를 위해 이것은 내 객체를 List of Specification 객체 (예를 들어) 대신 LinkedTreeMap의 List로 바꾸는 것입니다.
Ryan Newsom 2016

GsonUtils 클래스는 어디서 얻었습니까?
rosu alin

GsonUtils그가 자신의 toList()방법 을 넣은 수업 입니다.
user1438038

이것은 작동하지 않습니다 : 이것이 컴파일 될 때 T를 알 수 없기 때문에 TypeToken은 잘못된 값을 생성해야합니다. 아마도 List <Object>에 대한 형식 토큰을 만들 것입니다. 유형을 만들 때 실제 클래스를 사용해야합니다.
Hans-Peter Störr

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.