用Gson解析多值类型的Json数组

时间:2016-05-17 15:57:43

标签: json gson

我有一些Json(显示的片段),我发现使用Gson解析时很难。我可以解析json的其余部分。我读取下面的json片段的方式,我有一个名为arguments的数组,包含一个对象类型,另一个数组类型和一个字符串类型。我无法改变Json。

有没有人对如何使用Gson解析这个有任何想法?

"arguments": [
    {
        "codes": [
            "memberRequest.email",
            "email"
        ],
        "arguments": null,
        "defaultMessage": "email",
        "code": "email"
    },
    [],
    ".*"
]

1 个答案:

答案 0 :(得分:1)

这取决于您希望在Java表示中使用的数据结构。您可以选择3个选项:

选项1 ListList<Object>(Actualy Object s将为LinkedHashMapStringArrayList

new Gson().fromJson(JSON, ParentPOJO.class);

private static class ParentPOJO{
   public List<Object> arguments;
}

选项2 自定义MyListClass,其中包含MyListClass的自定义反序列化程序MyListClass extends ArrayList这样您就可以控制反序列化并为对象选择适当的数据类型。这将为您MyListClass extends ArrayList提供MyClassArrayListString。下面的演示。

public static void main(String[] args) {
    Gson gson = new GsonBuilder().registerTypeAdapter(MyListClass.class, new CustomDeserializer()).create();
    map = gson.fromJson(JSON, ParentPOJO.class);
}

private static class ParentPOJO{
    public MyListClass arguments;
}

private static class MyListClass extends ArrayList{}

private static class CustomDeserializer implements JsonDeserializer{

    @Override
    public Object deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        MyListClass list = null;
        if (json.isJsonArray()){
             list  = new MyListClass();
            JsonArray array = json.getAsJsonArray();

            for(int i = 0; i< array.size();i++){
                Object next = parseNext(array.get(i),context);
                list.add(next);
            }
        }

        return list;
    }
    private Object parseNext(JsonElement json, JsonDeserializationContext context){
        if (json.isJsonArray()){
            return context.deserialize(json, Object.class);//can change object type if you know it
        }else if(json.isJsonPrimitive()){
            return json.getAsJsonPrimitive().getAsString();
        }else if(json.isJsonObject()){
            return context.deserialize(json, MyClass.class);
        }
        return null;
    }
}

public class MyClass {
    @SerializedName("codes")
    private List<String> codes = new ArrayList<String>();
    @SerializedName("arguments")
    private Object arguments;
    @SerializedName("defaultMessage")
    private String defaultMessage;
    @SerializedName("code")
    private String code;
}

选项3 几乎完全相同,但MyPOJOClass代替MyListClass只需更改反序列化器,向MyPOJOClass添加字段并将json数组映射到pojo反序列化器中的字段。如果您选择自定义MyPOJOClass

的3-d选项,还必须创建自定义序列化程序

如果你的json数组中有多个相同类型的对象,你必须提出某种算法来解析它们。