1 回答
TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超9個(gè)贊
Gson 2.0+的解決方案
我剛剛了解到,使用更新的Gson版本,這非常簡(jiǎn)單:
GsonBuilder builder = new GsonBuilder();
Object o = builder.create().fromJson(json, Object.class);
創(chuàng)建的對(duì)象是一個(gè)Map(com.google.gson.internal.LinkedTreeMap),如果您打印它,它看起來(lái)像這樣:
{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}
...
使用自定義解串器的解決方案
(注意:除非您堅(jiān)持使用Gson 2.0之前的版本,否則您并不是真正的自定義反序列化器。但是了解如何在Gson中進(jìn)行自定義反序列化(和序列化)仍然很有用,并且通常最佳方法,具體取決于您要如何使用解析后的數(shù)據(jù)。)
因此,我們確實(shí)在處理隨機(jī)/可變字段名稱(chēng)。(當(dāng)然,這種JSON格式不是很好;這種數(shù)據(jù)應(yīng)該放在JSON數(shù)組中,在這種情況下,可以很容易地將其讀入List。哦,我們?nèi)匀豢梢越馕鏊?。?/p>
首先,這是我如何在Java對(duì)象中對(duì)JSON數(shù)據(jù)建模:
// 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;
}
}
然后,解析。處理此類(lèi)JSON的一種方法是為頂級(jí)對(duì)象(CityList)創(chuàng)建自定義反序列化器。
像這樣:
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);
}
}
需要注意的關(guān)鍵點(diǎn)是重新jsonObject.entrySet()調(diào)出所有頂級(jí)字段(名稱(chēng)如“ 1145”,“ 1148”等)的調(diào)用。這個(gè)堆棧溢出的答案幫助我解決了這個(gè)問(wèn)題。
完成下面的解析代碼。請(qǐng)注意,您需要使用registerTypeAdapter()注冊(cè)自定義序列化程序。
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);
(這是我用來(lái)測(cè)試的完整的可執(zhí)行示例。除了Gson之外,它還使用Guava庫(kù)。)
添加回答
舉報(bào)
