java - 使用 Gson 动态解析 JSON 字段类型

标签 java json gson

我有以下 API 响应:

{  
   "data":{  
      "categoryFields":[  
         {  
            "name":"brand",
            "label":"Marca", 
            "values":[  
               {  
                  "key":53,
                  "value":"Alfa Romeo"
               },
               {  
                  "key":55,
                  "value":"Audi"
               }
            ]
         },
         {  
            "name":"year",
            "label":"Año", ,
            "dataType":"select",
            "values":[  
               {  
                  "key":2017,
                  "value":2017
               },
               {  
                  "key":2016,
                  "value":2016
               }
            ]
         },

      ]
   }
}

好的,第一个 categoryField 中的值为:

"key":53 INT,
"value":"Alfa Romeo", STRING

在第二个categoryField中,值是:

 "key":2017, INT
 "value":2017, INT

还有另一种类型:

 "key":"string", STRING
 "value":"String", STRING

我需要一个可以处理这些类型数据的类。像这样的东西:

public class Value {

    @SerializedName("key")
    @Expose
    private DYNAMIC_TYPE key;

    @SerializedName("value")
    @Expose
    private DYNAMIC_TYPE value; 

}

我怎样才能做到这一点?或者有一个 Gson 函数可以帮助我做到这一点?

最佳答案

解决方案

public class CategoryValueDeserializer implements JsonDeserializer<CategoryValue> {
    @Override
    public CategoryValue deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

        final JsonObject jsonObject = json.getAsJsonObject();

        final JsonElement jsonKey = jsonObject.get("key");
        final String key = jsonKey.getAsString();

        final JsonElement jsonValue = jsonObject.get("value");
        final String value = jsonValue.getAsString();

        CategoryValue categoryValue = new CategoryValue();
        categoryValue.setKey(key);
        categoryValue.setValue(value);

        return categoryValue;

    }
}

//改造

 final Gson gson = new GsonBuilder()
                .registerTypeAdapter(Response.class, new CategoryValueDeserializer())
                .create();

        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(END_POINT)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create());

关于java - 使用 Gson 动态解析 JSON 字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43080847/

相关文章:

java - 如何在 Gson 中制作自定义列表反序列化器?

java - 在 Java 程序中执行 pig 命令

java - 在没有 Maven 的 Eclipse 中创建 src/main/java 文件夹结构

java - 一种根据给定时间表运行任务的方法

java - 如何使用 org.json.simple 解析没有根元素的 JSON 文件?

json - 新行输出 CloudFormation Json 模板

android - 使用 ProGuard 时是否可以混淆 GSON 注释中的字符串?

java - Java的实现是什么意思?

java - Jackson Json 并没有这样的方法错误

java - 从 json 文件中读取多个元素