如何用变量键(GSON)解析JSONArray?

时间:2016-03-03 14:03:26

标签: android json gson

我的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);

它不起作用或者它是服务器的问题?

2 个答案:

答案 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();