当前位置: 首页 > 面试题库 >

GSON:自定义对象反序列化

楚洋
2023-03-14
问题内容

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

编辑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;..."

此外,我只想存储用户ID,而不要存储完整的User,因为我已经将完整的用户与其他服务器API调用一起存储在其他位置。

所以我的班级课类似于:

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

因此,我想我们可以使用自定义解串器实现此目的,但是我不知道如何实现。我想尽可能减少内存,因此我不认为拥有完整的对象示例,然后使用它来构建my String example是正确的方法。

在最坏的情况下,如果太复杂了,在解析Example Object时,我希望能够至少仅存储Tag项列表:因此,我需要一个自定义的反序列化器来摆脱int
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文件。

  • GSON_STREAM通过
    读取JSON的大块JsonReader。代码更加复杂,但是它适用于大型JSON文件。从Android 3.0
    Honeycomb开始,GSON的流解析器包含为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可用时,我将交出代码。*



 类似资料:
  • 问题内容: 我需要反序列化json,它是日期/长值的数组。这是返回的JSON的示例: 使用GSON,我可以将其反序列化为,但希望能够将其转换为类似以下内容的方法: 我似乎找不到一种方法来指示GSON将JSON映射的键/值映射到我的自定义类中的日期/值字段。有没有办法做到这一点,还是地图列表是唯一的路线? 问题答案: 您需要编写一个自定义解串器。您还需要使用可以实际解析的时区格式。无论是也将匹配,这

  • 我有一个JestClient(elasticsearch)响应,我试图将其反序列化为一个对象。该对象包含两个DateTime字段,而在响应中,它们是字符串,因此我得到: 所以,我创建了一个自定义反序列化器来解决这个问题…然而,无论我做什么,我总是得到同样的错误。不知何故它没有注册使用它? 最后,我试图解析JestClient响应的代码: 无论我尝试什么,我总是得到上面的错误,我甚至不确定在这一点上

  • 我有下面的JSON,我正试图使用Jackson API反序列化它 我基本上需要一个附件类,它有一个AttachmentFile对象列表,如下所示: 如何使用自定义反序列化器实现这一点? 谢谢

  • 如何基于json中指定的类类型,在Jackson中实现从json到Java对象的转换。 Java类型示例:

  • 也许我跑错了方向,但我有一个元素列表,我想读。 我有一个抽象基类,让我们称之为: 现在我有两个可能的实现:

  • 问题内容: 我在使用Gson解析JSON响应时遇到问题。 JSON字串: 我有这两个课程: 但是当使用Gson解析这个时我有一个异常。我知道这是因为响应数组的第一个元素不是对象,而是整数。 所以问题是,我能以某种方式解决它吗? 问题答案: 您必须编写一个 自定义反序列化器 。我会做这样的事情: 首先,您需要包括一个新的类,而不是已有的两个类: 然后,您需要一个自定义解串器,类似于以下内容: 然后,