如何在Java中反序列化非统一的json?

时间:2014-08-04 20:01:12

标签: java json serialization deserialization

我想用这个json(上面一行)

向服务器发送一个http请求

我希望得到这样一个json并将其解析为Java对象(下行)

enter image description here

我记得上次,我想要反序列化的集合中缺少字段

崩溃反序列化

(对于单个反序列化,如果json没有这样的字段 - 插入了默认值)

有什么方法可以创建一个Java类来表示请求json和响应json对象上的两个类型?

我的尝试:

public class ConfigValue {

    public String key;
    public String defaultValue;
    public String value;
}




Gson gson = new Gson();
                        Type collectionType = new TypeToken<Array<ConfigValue>>() {
                        }.getType();

                        ConfigValue[] configValues = (ConfigValue[]) gson
                                            .fromJson(result, collectionType);

1 个答案:

答案 0 :(得分:0)

图像中的两个JSON字符串都不是ConfigValue对象的列表(或数组)。它们实际上是一个JSON对象,具有一个属性configValues,它是一个ConfigValue对象列表。因此,您需要一个包装类来将它们反序列化为:

public class ConfigValues {
    public ConfigValue[] configValues;
}

public class ConfigValue {
    public String key;
    public String defaultValue;
    public String value;
}

public static void main(String[] args) {
    String firstJson = "{\"configValues\":[{\"key\":\"radiusMeters\",\"value\":\"200\"}]}";
    String secondJson = "{\"configValues\":[{\"key\":\"redeemExpirationMins\",\"defaultValue\":\"300\"},{\"key\":\"radiusMeters\",\"value\":\"200\",\"defaultValue\":\"400\"}]}";

    Gson gson = new Gson();

    ConfigValues firstConfigValues = gson.fromJson(firstJson, ConfigValues.class);
    ConfigValues secondConfigValues = gson.fromJson(secondJson, ConfigValues.class);

    System.out.println(firstConfigValues);
    System.out.println(secondConfigValues);
}

如果将toString方法添加到这两个类,main方法将打印以下反序列化的对象:

  

ConfigValues(configValues = [ConfigValue(key = radiusMeters,defaultValue = null,value = 200)])

     

ConfigValues(configValues = [ConfigValue(key = redeemExpirationMins,defaultValue = 300,value = null),ConfigValue(key = radiusMeters,defaultValue = 400,value = 200)])

您可以看到ConfigValue的任何缺失字段都被反序列化为null。