programing

Gson을 사용하여 알 수 없는 필드를 사용하여 JSON을 디코딩하려면 어떻게 해야 합니까?

abcjava 2023. 3. 12. 10:19
반응형

Gson을 사용하여 알 수 없는 필드를 사용하여 JSON을 디코딩하려면 어떻게 해야 합니까?

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

{
  "unknown_field": {
    "field1": "str",
    "field2": "str",
    "field3": "str",
    "field4": "str",
    "field5": "str"
  }, ......
}

이 json을 매핑하기 위해 클래스를 만들었습니다.

public class MyModel implements Serializable {
  private int id;
  private HashMap<String, Model1> models;

  // getters and setter for id and models here
}

클래스 Model1은 String 필드만 있는 단순한 클래스입니다.

하지만 효과가 없어요.

편집: JSON 형식은 다음과 같습니다.

{
    "1145": {
        "cities_id": "1145",
        "city": "Nawanshahr",
        "city_path": "nawanshahr",
        "region_id": "53",
        "region_district_id": "381",
        "country_id": "0",
        "million": "0",
        "population": null,
        "region_name": "Punjab"
    },
    "1148": {
        "cities_id": "1148",
        "city": "Nimbahera",
        "city_path": "nimbahera",
        "region_id": "54",
        "region_district_id": "528",
        "country_id": "0",
        "million": "0",
        "population": null,
        "region_name": "Rajasthan"
    }, 
    ...
}

(사실 JSON이 이렇게 생겼다는 OP의 코멘트를 받고 답변을 완전히 갱신했습니다.)

Gson 2.0+용 솔루션

새로운 Gson 버전에서는 이것이 매우 간단하다는 것을 방금 알았습니다.

GsonBuilder builder = new GsonBuilder();
Object o = builder.create().fromJson(json, Object.class);

생성된 객체는 Map(com.google.gson.internal)입니다.Linked Tree Map)을 인쇄하면 다음과 같습니다.

{1145={cities_id=1145, city=Nawanshahr, city_path=nawanshahr, region_id=53, region_district_id=381, country_id=0, million=0, population=null, region_name=Punjab}, 
 1148={cities_id=1148, city=Nimbahera, city_path=nimbahera, region_id=54, region_district_id=528, country_id=0, million=0, population=null, region_name=Rajasthan}
...

커스텀 데시리얼라이저를 사용한 솔루션

(NB: 2.0 이전 버전의 Gson을 사용하지 않는 한 커스텀 디시리얼라이저는 필요 없습니다.그러나 여전히 Gson에서 커스텀 디시리얼라이제이션(및 시리얼라이제이션)을 실행하는 방법을 아는 것이 유용하며, 구문 분석된 데이터를 사용하는 방법에 따라서는 최선의 접근법이 될 수 있습니다.

즉, 랜덤 또는 다양한 필드명에 대응하고 있습니다.(물론 이 JSON 형식은 그다지 좋지 않습니다.이러한 데이터는 JSON 어레이 내에 있어야 합니다.이 경우 목록으로 쉽게 읽을 수 있습니다.아직 해석할 수 있습니다.)

먼저 Java 객체에서 JSON 데이터를 모델링하는 방법은 다음과 같습니다.

// info for individual city
public class City    {
    String citiesId;
    String city;
    String regionName;
    // and so on
}

// top-level object, containing info for lots of cities
public class CityList  {
    List<City> cities;

    public CityList(List<City> cities) {
        this.cities = cities;
    }
}

그 다음에 파싱.이런 종류의 JSON을 처리하는 방법 중 하나는 최상위 오브젝트(CityList)의 커스텀디시리얼라이저를 작성하는 것입니다.

다음과 같은 경우:

public class CityListDeserializer implements JsonDeserializer<CityList> {

    @Override
    public CityList deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {
        JsonObject jsonObject = element.getAsJsonObject();
        List<City> cities = new ArrayList<City>();
        for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
            // For individual City objects, we can use default deserialisation:
            City city = context.deserialize(entry.getValue(), City.class); 
            cities.add(city);
        }
        return new CityList(cities);
    }

}

주의할 점은 가 모든 최상위 필드('1145', '1148' 등)를 재실행하는 콜입니다.이 Stack Overflow 답변이 이 문제를 해결하는 데 도움이 되었습니다.

아래 구문 분석 코드를 완료하십시오.를 사용하여 커스텀시리얼라이저를 등록해야 합니다.

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(CityList.class, new CityListDeserializer());
Gson gson = builder.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
CityList list = gson.fromJson(json, CityList.class);

(이것이 테스트에 사용한 완전한 실행 가능한 예입니다.Gson 이외에도 Guava 라이브러리를 사용합니다.)

언급URL : https://stackoverflow.com/questions/20442265/how-to-decode-json-with-unknown-field-using-gson

반응형