(在OP评论说实际上JSON看起来像这样之后,我完全更新了答案。
Gson 2.0+ 解决方案
我刚刚了解到,对于较新的Gson版本,这非常简单:
GsonBuilder builder = new GsonBuilder();
Object o = builder.create().fromJson(json, Object.class);
创建的对象是一个 Map (com.google.gson.internal.LinkedTreeMap),如果打印它,它看起来像这样:
{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:事实证明,你并不是一个真正的自定义 deserialiser,除非你被困在 Gson 的 2.0 之前的版本。但是,了解如何在Gson中执行自定义反序列化(和序列化)仍然很有用,并且它通常是最好的方法,具体取决于您希望如何使用解析的数据。
因此,我们确实在处理随机/不同的字段名称。(当然,这种JSON格式不是很好;这种数据应该在JSON数组中,在这种情况下,它可以很容易地读入List。哦,好吧,我们仍然可以解析它。
首先,以下是我对 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) 创建自定义 deserialiser。
像这样:
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);
}
}
需要注意的一个关键点是对jsonObject.entrySet()
的调用,它重新调谐所有顶级字段(名称如“1145”,“1148”等)。这个堆栈溢出答案帮助我解决了这个问题。
在下面完成解析代码。请注意,您需要使用 registerTypeAdapter()
来注册自定义序列化器。
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,它还使用番石榴库。