gpt4 book ai didi

java - 如何使用 Jackson 在对象中包含原始 JSON?

转载 作者:IT老高 更新时间:2023-10-28 11:31:44 26 4
gpt4 key购买 nike

当使用 Jackson 对对象进行(反)序列化时,我试图在 Java 对象中包含原始 JSON。为了测试这个功能,我写了如下测试:

public static class Pojo {
public String foo;

@JsonRawValue
public String bar;
}

@Test
public void test() throws JsonGenerationException, JsonMappingException, IOException {

String foo = "one";
String bar = "{\"A\":false}";

Pojo pojo = new Pojo();
pojo.foo = foo;
pojo.bar = bar;

String json = "{\"foo\":\"" + foo + "\",\"bar\":" + bar + "}";

ObjectMapper objectMapper = new ObjectMapper();
String output = objectMapper.writeValueAsString(pojo);
System.out.println(output);
assertEquals(json, output);

Pojo deserialized = objectMapper.readValue(output, Pojo.class);
assertEquals(foo, deserialized.foo);
assertEquals(bar, deserialized.bar);
}

代码输出以下行:

{"foo":"one","bar":{"A":false}}

JSON 正是我想要的样子。不幸的是,当尝试将 JSON 读回对象时,代码失败并出现异常。这是一个异常(exception):

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token at [Source: java.io.StringReader@d70d7a; line: 1, column: 13] (through reference chain: com.tnal.prism.cobalt.gather.testing.Pojo["bar"])

为什么 jackson 在一个方向上运行得很好,但在另一个方向上却失败了?似乎它应该能够再次将自己的输出作为输入。我知道我想要做的是非正统的(一般建议是为 bar 创建一个内部对象,该对象具有名为 A 的属性),但我没有想要与这个 JSON 交互。我的代码充当了此代码的传递——我想接收此 JSON 并将其再次发送回去,而无需触及任何东西,因为当 JSON 更改时,我不希望我的代码需要修改。

感谢您的建议。

编辑:使 Pojo 成为一个静态类,这导致了不同的错误。

最佳答案

@JsonRawValue 仅用于序列化端,因为反向处理有点棘手。实际上,添加它是为了允许注入(inject)预编码的内容。

我想可以添加对反向的支持,尽管这会很尴尬:必须解析内容,然后重新写回“原始”形式,这可能相同也可能不同(因为字符引用可能不同)。这适用于一般情况。但也许它对某些问题的子集是有意义的。

但我认为针对您的特定情况的解决方法是将类型指定为“java.lang.Object”,因为这应该可以正常工作:对于序列化,字符串将按原样输出,而对于反序列化,它将被反序列化为 Map。实际上,如果是这样,您可能希望有单独的 getter/setter; getter 将返回字符串进行序列化(并且需要@JsonRawValue);和 setter 将采用 Map 或 Object。如果有意义,您可以将其重新编码为字符串。

关于java - 如何使用 Jackson 在对象中包含原始 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4783421/

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