0

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

  1. 服务 1 的响应

{

   "settings":[
      {
         "type":"userPreferences",
         "enforced":false,
         "name":"SavedItems",
         "private":false,
         "value":{
            "type":"xs:string",
            "$":"sessionExpired"
         },
         "canWrite":true,
         "displayName":"Saved Items"
      }
   ]
}
  1. 服务 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。

4

1 回答 1

2

1 - 您不必在您的 JSON 中提供目标对象的每个字段。这意味着您可以创建一个带有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 中)和关联值的字段。

于 2013-08-06T14:46:13.803 回答