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
'programing' 카테고리의 다른 글
PyMongo upsert가 "upsert는 bool의 인스턴스여야 합니다" 오류를 발생시킵니다. (0) | 2023.03.17 |
---|---|
처리되지 않은 예외:InternalLinkedHashMap'은 '목록' 유형의 하위 유형이 아닙니다. (0) | 2023.03.12 |
ORA-00054: 리소스가 사용 중이고 NOWAIT가 지정되어 있거나 타임아웃이 만료되었습니다. (0) | 2023.03.12 |
Swift에서 JSON을 디코딩할 때 "데이터가 없어 데이터를 읽을 수 없습니다" 오류가 발생했습니다. (0) | 2023.03.12 |
wordpress: 헤더의 기본 위치.php 및 바닥글.php (0) | 2023.03.12 |