【问题标题】:Parse json containing dynamic fields using Gson使用 Gson 解析包含动态字段的 json
【发布时间】:2016-03-08 01:17:40
【问题描述】:

我有一个这样的模型:

class MyModel{
    String id;
    String name;
    String field;

   //Getters and setters
}

我正在使用以下代码使用 Gson 解析 json

// Returns the json containing list of objects
// with properties supplied to the method
String response = getResponse(new String[] { "id", "name", "value",
  {A variable field whose value is determined at runtime}});
MyModel obj = new Gson().fromJson(response,
    new TypeToken<List<MyModel>>() {}.getType());

该代码适用于 3 个预定义字段。第四个字段的名称是变量(在运行时确定),我无法在模型中创建硬编码字段,因为该字段不固定。如何解析这样一个字段是动态的json?

【问题讨论】:

  • 我想Gson 使用 TypeToken 是不可能的,你必须手动获取动态字段。
  • @Clairvoyant 没有typetoken可以吗?
  • 第四个字段的数据类型保持不变???如果字段名称将被 2 或 3 个随机名称更改,那么您可以使 2 或 3 个具有第四个字段名称不同的类
  • @Clairvoyant 是的,数据类型始终是字符串。但名称可以是任何东西,而不仅仅是 2 或 3 个随机名称。

标签: android json gson


【解决方案1】:

您可以通过以下代码获取所有键名:

JSONObject jsonObject = new JSONObject(response);
Iterator keys = jsonObject.keys();

 while(keys.hasNext()) {
       String dynamicKey = (String)keys.next();
       JSONObject currentDynamicValue = jsonObject.getJSONObject(dynamicKey);
  }

您可以使用ArrayListArray 来保存所有键名。

【讨论】:

  • 谢谢,我认为这种方式可行。让我知道我是否可以使用 gson?
【解决方案2】:

您可以尝试以下选项:

  • Gson 2.5 支持同一变量的多个字段名称。如果值是在运行时确定的,但值的集合是有限的,那么你可以这样做:

    @SerializedName(value="name1", alternate={"name2", "name3"}) String b;
    
  • 创建自定义反序列化器:

    public static class YourModelDeserializer implements JsonDeserializer<YourModel> {
        @Override
        public YourModel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException
        {
            /* Deserialize here */;
        }
    }
    

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多