我正在尝试使用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并转换为对象时,代码会出现异常。这里是异常信息:org.codehaus.jackson.map.JsonMappingException: 无法将 START_OBJECT 标记反序列化为 java.lang.String 类型 在 [Source: java.io.StringReader@d70d7a; line: 1, column: 13] (通过引用链 com.tnal.prism.cobalt.gather.testing.Pojo["bar"]) 中 为什么Jackson在一个方向上可以完美地工作,但在另一个方向上失败呢?它似乎应该能够将自己的输出作为输入再次使用。我知道我尝试做的事情很不寻常(通常建议为`bar`创建一个内部对象,该对象具有名为`A`的属性),但我不想与此JSON交互。我的代码充当此代码的传递 - 我希望接收此JSON并将其原样发送回去,而不需要修改任何内容,因为当JSON发生变化时,我不希望我的代码需要进行修改。
感谢您的建议。
编辑:将Pojo更改为静态类,这导致了不同的错误。