确定,所以我编辑了问题,因为它不够清楚。
编辑2 :更新了JSON文件。
我在Android应用程序中使用GSON,我需要解析来自服务器的JSON文件,这些文件有点太复杂了。我不想让我的对象结构太沉重,所以我想简化内容: 所以我的对象的结构将不是JSON文件的结构。
例如,如果在JSON中,我有以下内容:
{ "object1":{ "attribute1" : "test1", "attribute40" : "test40", "user":{ "id":1, "name":"foo" } ,"example":{ "total":10, "list":[ { "tag":"tag1", "name":"object name 1", "pos":1 }, { "tag":"tag10", "name":"object name 10", "pos":10 } ] } } "object2":{ "attribute1":"test..." } }
我不想保留我当前的对象结构,即一个对象Example,其中包含一个ArrayList和一个int“总计”。但是我只想将一个简单的String保留为value "object name 1;object name 2;..."。
Example
ArrayList
int
"object name 1;object name 2;..."
此外,我只想存储用户ID,而不要存储完整的User,因为我已经将完整的用户与其他服务器API调用一起存储在其他位置。
所以我的班级课类似于:
class Foo{ int userId; String example; //"object name 1;object name 2;..." ... }
因此,我想我们可以使用自定义解串器实现此目的,但是我不知道如何实现。我想尽可能减少内存,因此我不认为拥有完整的对象示例,然后使用它来构建my String example是正确的方法。
String example
在最坏的情况下,如果太复杂了,在解析Example Object时,我希望能够至少仅存储Tag项列表:因此,我需要一个自定义的反序列化器来摆脱int total。
total
所以我会有:
class Foo{ int userId; ArrayList<Tag> example; ... }
我采用了答案,以介绍聊天中设计的完整解决方案并适合更改后的JSON字符串。该代码假定字符串json完全包含问题中的(更新的)JSON。要求是填充以下类(省略setter和toString):
class Object1 { private String attribute1; private String attribute40; private int userId; private String nameList; }
GSON支持(与大多数其他REST库一样)三种模式:
GSON_DOM 通过读取整个JSON JsonParser.parse()并在内存中构建DOM树(对象模型访问)。因此,此解决方案适用于小型JSON文件。
JsonParser.parse()
GSON_STREAM通过 读取JSON的大块JsonReader。代码更加复杂,但是它适用于大型JSON文件。从Android 3.0 Honeycomb开始,GSON的流解析器包含为android.util.JsonReader。
JsonReader
android.util.JsonReader
GSON_BIND 通过反射将数据直接绑定到类,从而极大地减少了代码。GSON允许使用混合模式,这意味着应结合该答案显示的GSON_DOM和GSON_BIND或GSON_STREAM和GSON_BIND。
通过GSON_DOM和GSON_BIND填充类Object1,实现如下所示:
private static void deserializeViaObjectAccess(final String json) { Gson gson = new Gson(); // Read the whole JSON into meomory via GSON_DOM JsonParser parser = new JsonParser(); JsonObject object1 = parser.parse(json).getAsJsonObject().getAsJsonObject("object1"); // map the Object1 class via GSON_BIND // (bind common attributes which exist in JSON and as properties in the class) // mapper acts as factory Object1 result = gson.fromJson(object1, Object1.class); // manually read the attribute from the user object int userId = object1.getAsJsonObject("user").getAsJsonPrimitive("id").getAsInt(); result.setUserId(userId); // manually read the attributes from the example object String names = ""; JsonArray list = object1.getAsJsonObject("example").getAsJsonArray("list"); for (int i = 0; i < list.size(); ++i) { JsonObject entry = list.get(i).getAsJsonObject(); String name = entry.getAsJsonPrimitive("name").getAsString(); names = i == 0 ? name : names + "; " + name; } result.setNameList(names); // Output the result log.debug(result.toString()); }
通过GSON_STREAM和GSON_BIND填充类Object1,实现如下:
目前,这仅在通过GSON_BIND或GSON_STREAM完全加载节点时才可行。此示例需要拆分节点本身。这仅在即将发布的2.2版中可行。当GSON 2.2可用时,我将交出代码。*