Gson을 사용하여 JSON 배열을 java.util.List로 구문 분석


119

다음 내용 의 JsonObject이름 "mapping"이 있습니다.

{
    "client": "127.0.0.1",
    "servers": [
        "8.8.8.8",
        "8.8.4.4",
        "156.154.70.1",
        "156.154.71.1"
    ]
}

다음 "servers"과 같이 배열 을 얻을 수 있다는 것을 알고 있습니다 .

mapping.get("servers").getAsJsonArray()

그리고 지금은 그 구문을 분석 할 JsonArrayjava.util.List...

이를 수행하는 가장 쉬운 방법은 무엇입니까?



2
@ruakh 그 질문 과이 질문에는 많은 차이점이 있습니다. 이것은 Gson.
Abel Callejo 2013-08-31

@AbelMelquiadesCallejo가 답변을 살펴보고 문제가 해결되기를 바랍니다.
Prateek

@ruakh 예 나는 당신과 동의하고 JsonArray구현을 알고 있습니다 Iterable. 새로운 라이브러리를 추가하는 것 외에 새로운 방법을 찾고 있다는 것뿐입니다.
Abel Callejo 2013-08-31

답변:


273

가장 쉬운 방법은 Gson의 기본 구문 분석 기능을 사용하는 것 fromJson()입니다.

당신이 어떤으로 직렬화해야하는 경우에 적합한이 기능의 구현이있다 ParameterizedType(예를 들어, 어떤 List이다) fromJson(JsonElement json, Type typeOfT).

귀하의 경우에는, 당신은 단지 얻을 필요가 Type의를 List<String>하고 그 다음에 JSON 배열을 구문 분석 Type과 같이 :

import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();

List<String> yourList = new Gson().fromJson(yourJson, listType);

귀하의 경우 yourJsonJsonElement이지만 String, any Reader또는 a 일 수도 있습니다 JsonReader.

Gson API 문서를 살펴볼 수 있습니다 .


7
Type어떤 패키지에서 찾을 수 있습니까?
Abel Callejo 2013-08-31

10
Type패키지에있는 Java 내장 인터페이스입니다java.lang.reflect
MikO 2013-08-31

내가 사용했다 getString()대신 get()또는 다른 .fromJson()불평했다.
lenooh

@MikO 여기 Gson과 비슷한 질문이 있습니다 . 도와 주실 수 있는지 알고 싶었어요. 해결책이 있지만 문제는 JSON을 Map으로 구문 분석하는 것이 매우 지저분 해 보입니다.
john

18

아래 코드는 com.google.gson.JsonArray. List의 요소와 List의 요소 수를 인쇄했습니다.

import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;


public class Test {

    static String str = "{ "+ 
            "\"client\":\"127.0.0.1\"," + 
            "\"servers\":[" + 
            "    \"8.8.8.8\"," + 
            "    \"8.8.4.4\"," + 
            "    \"156.154.70.1\"," + 
            "    \"156.154.71.1\" " + 
            "    ]" + 
            "}";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            JsonParser jsonParser = new JsonParser();
            JsonObject jo = (JsonObject)jsonParser.parse(str);
            JsonArray jsonArr = jo.getAsJsonArray("servers");
            //jsonArr.
            Gson googleJson = new Gson();
            ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
            System.out.println("List size is : "+jsonObjList.size());
                    System.out.println("List Elements are  : "+jsonObjList.toString());


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

산출

List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]

8

여기 Gson의 공식 웹 사이트에서 솔루션을 읽었습니다 .

그리고이 코드는 다음과 같습니다.

    String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";

    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
    JsonArray jsonArray = jsonObject.getAsJsonArray("servers");

    String[] arrName = new Gson().fromJson(jsonArray, String[].class);

    List<String> lstName = new ArrayList<>();
    lstName = Arrays.asList(arrName);

    for (String str : lstName) {
        System.out.println(str);
    }    

모니터에 결과 표시 :

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

동일 않음 위 - 여전히 정적 메소드를 사용하여new Gson().fromJson()
아벨 Callejo

내 문제는 다른 것이었지만 귀하의 스 니펫은 내 문제를 해결합니다. 문자열 목록을 저장했지만 문자열을 가져오고 싶습니다. 그런 다음 귀하의 스 니펫은 데이터를 가져 오기 위해 String []. class를 넣을 수 있음을 상기시킵니다. 감사합니다
badarshahzad

2

@SerializedName모든 필드에 대해 사용하는 목록 매핑을 얻을 수있었습니다 Type. 주변 에 논리 가 필요 하지 않았습니다 .

코드 실행- 아래 4 단계 -디버거를 통해 List<ContentImage> mGalleryImages객체가 JSON 데이터로 채워지 는 것을 관찰 할 수 있습니다.

예를 들면 다음과 같습니다.

1. JSON

   {
    "name": "Some House",
    "gallery": [
      {
        "description": "Nice 300sqft. den.jpg",
        "photo_url": "image/den.jpg"
      },
      {
        "description": "Floor Plan",
        "photo_url": "image/floor_plan.jpg"
      }
    ]
  }

2. 목록이있는 Java 클래스

public class FocusArea {

    @SerializedName("name")
    private String mName;

    @SerializedName("gallery")
    private List<ContentImage> mGalleryImages;
}

3. 목록 항목에 대한 Java 클래스

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. JSON을 처리하는 자바 코드

    for (String key : focusAreaKeys) {

        JsonElement sectionElement = sectionsJsonObject.get(key);
        FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
    }

0

로 시작하는 mapping.get("servers").getAsJsonArray()경우 Guava에 액세스 Streams할 수있는 경우 아래 한 줄짜리를 수행 할 수 있습니다.

List<String> servers = Streams.stream(jsonArray.iterator())
                              .map(je -> je.getAsString())
                              .collect(Collectors.toList());

노트 StreamSupportJsonElement유형에 대해 작업 할 수 없으므로 충분하지 않습니다.

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