使用Gson推广字段名称

时间:2014-06-24 08:43:25

标签: java android json gson

我有一个JSON objext,如下所示:

       {
               "isDefault": false,
               "someIndex":
               [
                   0
               ],
               "label": "Hello",
               "valueKindName": "someId",
               "value": 3,
               "conditions":
               {
                   "salesType":
                   [
                       1,
                       2
                   ],
                     "productType":
                   [
                       1,
                       5
                   ]
               }
           }

现在我的条件类看起来像这样:

public class Conditions {

private List<Integer> salesType = new ArrayList<Integer>();
private List<Integer> productType = new ArrayList<Integer>();

}

这很有效。 我想要做的是概括我的课程,以便我可以在以下条件下使用任何新类型:

   "exampleType":
                   [
                       6,
                       9
                   ]

无需添加

private List<Integer> exampleType = new ArrayList<Integer>();

到我的Conditions.class

我想到了以下几点:

public class Conditions {

    private ArrayList<Condition> conditions = new ArrayList<Condition>();
}

public class Condition {

    private String key;
    private ArrayList<Integer> values;
}

但Gson当然不知道如何将JSON转换为该类型的数据结构。

任何帮助都会得到高度赞赏:)

1 个答案:

答案 0 :(得分:1)

您可以注册自己的转换器。看起来有点像这样:

public class ConditionConverter implements JsonSerializer<Condition>, JsonDeserializer<Condition>
{
  @Override
  public JsonElement serialize(Condition src, Type typeOfSrc, JsonSerializationContext context)
  {
    final JsonObject cond = new JsonObject()
    cond.add(src.key, context.serialise(src.values);

    return cond;
  }

  public Condition deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException
  {
    // pick apart and make a condition again
  }
}

然后使用GsonBuilder注册类型适配器:

builder.registerTypeAdapter(Condition.class, new ConditionConverter());

要分开您的对象,您需要使用JsonObject.entrySet(),因为您事先不知道密钥名称。如果你采用这样的JSON,你的工作会稍微容易一些:

{
  key: "exampleType",
  values: [ 42, 43 ]
}