当前位置: 首页 > 知识库问答 >
问题:

使用GSON反序列化包含JSON的对象

路裕
2023-03-14

我正在使用 gson 从 JSON 表示中反序列化 POJO 对象。

我希望我的一个POJO中的一个字段包含任意JSON数据。例如:

class B {
    public String stringField;
    public JsonObject jsonField;
}

我希望能够在以下Json上调用< code>Gson.fromJson(json,B.class):

{
    "stringField": "booger",
    "jsonField" :
    {
        "arbitraryField1": "foo"
    }
}

并使生成的B.json字段包含一个JsonObject,其值为foo

但是,当我尝试这样做时,jsonfield总是一个空对象({})。事实上,更一般地说,以下似乎总是返回一个空对象:

new Gson().fromJson("{ foo: 1 }", JsonObject.class)

我希望上面的内容返回一个对象,其中包含值为 1 的名为 foo 的字段。

如何让gson在将json反序列化为POJOS时保留任意json数据?

共有3个答案

逑俊楚
2023-03-14

考虑这个反序列化器,这是我对文档的解释。

import com.google.gson.*;
import java.lang.reflect.Type;

class B {
    public String stringField;
    public JsonObject jsonField;
}

class BDeserializer implements JsonDeserializer<B> {
    public B deserialize(JsonElement json, Type typeOfT, 
                         JsonDeserializationContext context)
                 throws JsonParseException {
        JsonObject jsonObject = json.getAsJsonObject();

        B b = new B();
        b.stringField = jsonObject.get("stringField").getAsString();
        b.jsonField = jsonObject.getAsJsonObject("jsonField"); 

        return b;
    }
}

public class Test {
    static public void main(String[] args) {
        GsonBuilder gson = new GsonBuilder();
        gson.registerTypeAdapter(B.class, new BDeserializer());

        String json = " { \"stringField\" : \"booger\", \"jsonField\" : { \"arbitraryField1\" : \"foo\" } } ";

        B b = gson.create().fromJson(json, B.class);
        System.out.println(b.stringField);
        System.out.println(b.jsonField.toString());
    }
}
慕容弘懿
2023-03-14

您可以使用JsonParser:

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{ \"foo\": \"1\" }").getAsJsonObject();
樊熠彤
2023-03-14

我能够通过引入一个包含JsonObject的包装器对象来解决这个问题,然后为该对象编写一个自定义反序列化器,该反序列化器只返回原始json。然而,似乎必须有更好的方法。

对于后代,反序列化器和简单的包装对象如下所示:

class MyJsonObjectWrapperDeserializer implements JsonDeserializer<MyJsonObjectWrapper> {
    @Override
    public MyJsonObjectWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return new MyJsonObjectWrapper(json.getAsJsonObject());
    }
}

class MyJsonObjectWrapper {
    public JsonObject json;

    public MyJsonObjectWrapper(JsonObject json) {
        this.json = json;
    }
}
 类似资料:
  • 我的目标是让这个电话“只是工作”。

  • 问题内容: 我在反序列化以下json数组时遇到麻烦(对不起,大小): 如果将其粘贴到json-viewer中,则会得到以下结构: 现在,包含具有坐标的数组的数组具有可变大小。所以我想在Java中,整个对象应该是一个数组,其中包含数组的集合,每个数组都包含一个。就像是 但是gson不接受这一点。我收到以下错误消息: 这似乎很奇怪,因为对我来说好像不像一个数组。但这可能使我感到困惑,或多或少地迷路了…

  • 问题内容: 我有以下JSON字符串: 我需要将值存储在单独的字符串中。 这是我到目前为止所拥有的,但这只是为我提供了整个JSON字符串,而不是特定的imgurl字段。 是JSON字符串。这是我的数据类: 问题答案: 解析这种简单的结构时,不需要专用的类。 解决方案1: 要使用gson从字符串中获取imgurURL,可以执行以下操作: 这使用原始解析到JsonObject中。 解决方案2: 另外,您

  • 这是我目前所拥有的,但这只给了我整个JSON字符串,而不是特定的imgurl字段。 是JSON字符串。下面是我的数据类:

  • 问题内容: 我在尝试使用Gson库反序列化对象的JSON数组时遇到问题。 JSON数组的示例: 你怎么看?反序列化此类JSON响应的正确Java代码是什么? 问题答案: 要反序列化JSONArray,您需要使用TypeToken。您可以从GSON用户指南中了解更多信息。示例代码: 如果您有JSONArray,则可以使用

  • 当我试图使用Gson库反序列化JSON对象数组时,我遇到了一个问题。 JSON数组的一个示例: 你怎么认为?反序列化这种JSON响应的正确Java代码是什么?

  • 使用GSON如何将列表的类名附加到输出的json字符串中?我已经浏览了api,但没有找到任何与此相关的参考资料。我在真实代码中使用了GsonBuilder,但也没有看到任何选项。 这将提供以下输出: json=[{“name”:“Alice”},{“name”:“Bob”}] 如何实现以下输出?或者类似的东西。 json={"人":[{"名字":"爱丽丝"},{"名字":"鲍勃"}]} 或 jso

  • 问题内容: 我正在尝试开发非常简单的json网络服务,以返回这种形式的数据: 如您所见,这非常简单。我的POJO扩展了ResourceSupport,因此解析链接没有问题。它们是这样的: UsersJson(根元素) 用户杰森 事实是,我期望jackson和spring足够聪明,可以解析_embedded属性并填充我的UsersJson.users属性,但事实并非如此。 我尝试了在互联网上发现的各