2015-05-27 66 views
0

JSON结果为我从服务器获取如下:在JSON阵列(GSON)反序列化不同的对象

{ 
    "result": [ 
    { 
     "meta": { 
     "rows": "3" 
     } 
    }, 
    { 
     "items": [ 
     { 
      "id": "1", 
      "name": "Steve", 
      "age": "30" 
     }, 
     { 
      "id": "2", 
      "name": "Mary", 
      "age": "29" 
     }, 
     { 
      "id": "3", 
      "name": "Bill", 
      "age": "58" 
     } 
     ] 
    } 
    ] 
} 

我如何反序列化由GSON在我的Android应用程序(我使用的是改造)?
我无法想象在result因为不同的对象类型的任何包装类。
任何帮助,将不胜感激!

+0

我使用改装反序列化。所以,我创建了一个'Meta'类和'UserList'类与'名单 items'但我就是不能让他们融入这个怪异的数组。 –

+0

那么,它是怎么回事?你解决了这个问题吗?如果是的话,选择一个答案并接受它,或者如果你以不同的方式解决问题,请写下自己的答案。 –

+0

我创建了一个通过JSON的'TypeAdapterFactory'。当API改变时,我大约完成了70%。新的API具有“正常”结构,所以我不需要再进行自定义分析。但是为了解决这个问题,我打算在空闲时间内完成最后的30%。我会在这里发布结果。 –

回答

0

对于很好的例子 Converting JSON to Java

其他方式,您可以将您的JSON转换为Java对象

请使用org.json库http://www.json.org/java/index.html

然后,例如

json = new JSONObject(YOUR_JSON).getJSONObject("result"); 
JSONArray items = data.getJSONArray("items"); 
String name = items.getJSONObject(0).getString("name"); 
0

你可以写一个类型适配器来处理将(去)序列化到(从)数组的类型。你甚至可以使它成为通用的,所以它可以使用类型如Pair<A, B>。这里是非通用类型的例子:https://github.com/cakoose/json-tuple-databinding-examples/blob/master/java/src/GsonEntryCustomizer.java - 它的(de)序列化Entry(从数组)。
免责声明 - 我没有写,也没有测试的代码,但它似乎是合法的。

如果你只遇到过这样的问题一次(就像在你的例子),你可能不会打扰使它通用的,只写TypeAdapter您对特定的2个不同的类别。读取代码非常简单:

in.beginArray(); 
SomeClass1 info1 = gson.getAdapter(SomeClass1.class).read(in); 
SomeClass2 info2 = gson.getAdapter(SomeClass2.class).read(in); 
in.endArray(); 
return new SomeContainerClass(info1, info2); 

(见https://github.com/cakoose/json-tuple-databinding-examples/blob/master/java/src/GsonEntryCustomizer.java#L52