Gson:处理可选的List

时间:2016-04-05 17:33:54

标签: java json gson

我正在使用Gson将JSON(由jquery查询构建器生成)解析为相应的Java Object。我的问题是属性“value”可以是数组或单个值:

{
  "condition": "AND",
  "rules": [
    {
      "id": "date",
      "field": "date",
      "type": "date",
      "input": "text",
      "operator": "between",
      "value": [
        "01.01.2016",
        "20.01.2016"
      ]
    }
  ]
}

{
  "condition": "AND",
  "rules": [
    {
      "id": "date",
      "field": "date",
      "type": "date",
      "input": "text",
      "operator": "equal",
      "value": "01.01.2016"
    }
  ]
}

显然Gson可以为第一个JSON构建对象,如果我的类有private String[] value这样的字段,第二个是private String value这样的字段 - 但不是两个带有Java字段选项的JSON输入。

所以我的问题:是一种处理这两种方式的方法,无论是单个“值”还是一系列“值”?

1 个答案:

答案 0 :(得分:1)

我不知道你用来反序化这个JSON的类的结构是什么,但是我想知道有这样的类

public class Rule {

    private String id;
    private String field;
    private String type;
    private String input;
    private String operator;
    private List<String> value;

    // constructors, getters and setters
}

如您所见,value属性被定义为java.lang.String个对象的列表。这种方法将帮助我们处理这两种情况:value是一个数组,当它是一个简单的字符串值。

我们可以用Gson做些什么?我们可以像这样创建自定义反序列化器

public class CustomSerializer implements JsonDeserializer<Rule> {
    public Rule deserialize(JsonElement jsonElement, Type type,
                             JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {

        JsonObject obj = (JsonObject) jsonElement;
        JsonElement value = obj.get("value");
        List<String> values = new ArrayList();
        if (value.isJsonArray()) {

            for (JsonElement jsonElement1 : value.getAsJsonArray()) {
                String str = jsonElement1.getAsString();
                values.add(str);
            }
        } else {
            values.add(value.getAsString());
        }
        // deserialize other properties


        Rule rule = new Rule();
        rule.setValue(values);
        // set other properties
        return rule;
    }
}

之后,您需要使用

注册反序列化器
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Rule.class, new CustomSerializer ())
        .create(); 

您可以反序列化JSON对象,如

{
  "id": "date",
  "field": "date",
  "type": "date",
  "input": "text",
  "operator": "equal",
  "value": "01.01.2016"
}

这是整个数据结构的一部分。