我正在使用 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数据?
考虑这个反序列化器,这是我对文档的解释。
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());
}
}
您可以使用JsonParser:
JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{ \"foo\": \"1\" }").getAsJsonObject();
我能够通过引入一个包含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属性,但事实并非如此。 我尝试了在互联网上发现的各