我的json是:
{"array":[{"US":"id_123"},{"UK":"id_112"},{"EN":"id_1112"}...]}
我的课程是:
class LocaleResponce implements Serializable{
@SerializedName("array")
List<Locale> array;
}
class Locale implements Serializable{
@SerializedName("title")
String title;
@SerializedName("id")
String id;
}
我试图这样做:
Gson gson = new Gson();
Type type = new TypeToken<LocaleResponce >(){}.getType();
LocaleResponce response = gson.fromJson(cacheJsonObject.toString(), type);
它不起作用或者它是服务器的问题?
答案 0 :(得分:3)
可以通过创建自定义JsonDeserializer来实现。 您的反序列化器类看起来像
public class CityListDeserializer implements JsonDeserializer<List<City>>{
@Override
public List<City> deserialize(JsonElement element, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
List<City> cityList = new ArrayList<>();
JsonObject parentJsonObject = element.getAsJsonObject();
Map.Entry<String, JsonElement> entry = parentJsonObject.entrySet().iterator().next();
Iterator<JsonElement> iterator = entry.getValue().getAsJsonArray().iterator();
City city;
while (iterator.hasNext()){
JsonObject cityJsonObject = iterator.next().getAsJsonObject();
for(Map.Entry<String, JsonElement> entry1 : cityJsonObject.entrySet()){
city = new City();
city.cityName = entry1.getKey();
city.id = entry1.getValue().toString();
cityList.add(city);
}
}
return cityList;
}
}
您可以将其与
一起使用try {
JSONObject object = new JSONObject("{\"array\":[{\"US\":\"id_123\"},{\"UK\":\"id_112\"},{\"EN\":\"id_1112\"}]}");
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(new TypeToken<ArrayList<City>>() {}.getType(), new CityListDeserializer());
Gson gson = builder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
List<City> cityList = gson.fromJson(String.valueOf(object), new TypeToken<ArrayList<City>>() {}.getType());
} catch (JSONException e) {
e.printStackTrace();
}
您的城市课程将
public class City {
String cityName;
String id;
}
答案 1 :(得分:0)
您可以使用http://www.jsonschema2pojo.org/等网站为Json生成类array
数组变量,没有同构对象数组{"US":"id_123"},{"UK":"id_112"},{"EN":"id_1112"}
这些都是不同的对象{ {1}}因为,参数键是不同的,所以对于解析这个,你不能使用Pojo。参数不同于UK US EN等,这里的解决方案是要求正在开发api的人发送一致的Json,你收到的数组不是类型安全的,如果你想在Java中使用它你必须写出许多代码行。例如,您可以像这样获得参数“UK”的值
DataTypes
例如,这将返回值cacheJsonObject.get("array").getAsJsonArray().get(1).get("UK").getAsString();
。