gpt4 book ai didi

java - GSON : custom object deserialization

转载 作者:搜寻专家 更新时间:2023-10-30 21:18:28 24 4
gpt4 key购买 nike

好的,所以我编辑了问题,因为它不够清楚。

编辑 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 "total ”。但我只想保留一个简单的字符串,其值为 "object name 1;object name 2;..."

此外,我只想存储用户 ID,而不是完整的用户,因为我已经通过其他服务器 API 调用将完整的用户存储在其他地方。

所以我的类(class)会是这样的:

class Foo{
int userId;
String example; //"object name 1;object name 2;..."
...
}

所以我想我们可以使用自定义反序列化器来实现这一点,但我不知道如何实现。我希望尽可能减少内存,所以我不认为拥有一个完整的对象示例,然后使用它来构建我的 String example 是正确的方法。

在最坏的情况下,如果它太复杂,我希望在解析示例对象时至少能够存储标签项列表:所以我需要一个自定义反序列化器来摆脱 int 总计

所以我会:

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-libs 一样)三种模式:

  • GSON_DOM
    通过 JsonParser.parse() 读取整个 JSON 并在内存中构建 DOM 树(对象模型访问)。因此,此解决方案适用于小型 JSON 文件。
  • GSON_STREAM
    通过 JsonReader 只读取 JSON block 。代码比较复杂,但适用于大型 JSON 文件。从 Android 3.0 Honeycomb 开始,GSON 的流解析器包含在 android.util.JsonReader 中。
  • GSON_BIND
    通过反射直接将数据绑定(bind)到类,显着减少了代码。 GSON 允许混合模式,这意味着组合 GSON_DOM 和 GSON_BIND 或 GS​​ON_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,实现如下所示:

At the moment, this is only possible when a node is completly loaded via GSON_BIND or GSON_STREAM. This example needs that a node itself should be splitted. This is only possible with the upcoming version 2.2. I will hand the code in later when GSON 2.2 is available.*

关于java - GSON : custom object deserialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8533020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com