在Java中使用GSON进行JSON解析的动态模型创建

时间:2013-08-06 14:15:03

标签: java json gson

要解析我正在使用GSON的SOAP服务的响应。目前我正在为每项服务提供单独的模型类。有两种服务几乎相似。

  1. 服务1的回复
  2.   

    {

       "settings":[
          {
             "type":"userPreferences",
             "enforced":false,
             "name":"SavedItems",
             "private":false,
             "value":{
                "type":"xs:string",
                "$":"sessionExpired"
             },
             "canWrite":true,
             "displayName":"Saved Items"
          }
       ]
    }
    
    1. 服务2的回复
    2.   

      {

         "settings":[
            {
               "type":"selectMultipleItems",
               "enforced":true,
               "name":"cartInfo",
               "private":true,
               "value":{
                  "type":"xs:string",
                  "$":"currentPage"
               },
               "lookupValue": "Profile,Home,Transaction,Error",
               "canWrite":true,
               "displayName":"Current Page Index"
            }
         ]
      }
      

      清楚地看到在服务2的响应中还有一个字段,即lookupValue。

      我在这里有两个问题,列在下面 -

      1. 是否有办法在普通模型类中处理这种情况,而不是为每个模型类设置单独的模型类?

      2. JSON是键值对结构,我可以创建这样的类,可以动态分配映射其值的每个键吗?这适用于任何JSON。

1 个答案:

答案 0 :(得分:2)

1 - 您不必在JSon中提供目标Object的每个字段。这意味着您可以使用lookupValue字段创建对象,并为上面的两个Json使用相同的对象。该字段将在第一个字段中被忽略(null)。

2 - 这或多或少是Gson在内部做的事情。试试这个:

public class Test {
  String x;
  Integer y;

  public static void main(String[] args) {
    Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(Object.class, new JsonDeserializer<Object>() {
      @Override
      public Object deserialize(JsonElement arg0, Type arg1, JsonDeserializationContext arg2) throws JsonParseException {
        Set<Entry<String, JsonElement>> values = arg0.getAsJsonObject().entrySet();
        System.out.println(values);

        return null;
      }

    }).create();

    gson.fromJson("{'x':'AA','y':5}", Test.class);
  }
}

正如您在适配器中看到的那样,您可以检索Set<Entry<String, JsonElement>>,它为您提供字段的名称(在Json中)和相关值。