要解析我正在使用GSON
的SOAP服务的响应。目前我正在为每项服务提供单独的模型类。有两种服务几乎相似。
{
"settings":[ { "type":"userPreferences", "enforced":false, "name":"SavedItems", "private":false, "value":{ "type":"xs:string", "$":"sessionExpired" }, "canWrite":true, "displayName":"Saved Items" } ] }
{
"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。
我在这里有两个问题,列在下面 -
是否有办法在普通模型类中处理这种情况,而不是为每个模型类设置单独的模型类?
JSON是键值对结构,我可以创建这样的类,可以动态分配映射其值的每个键吗?这适用于任何JSON。
答案 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中)和相关值。