jackson 如何序列化一个对象并将其读入JsonNode?

gg0vcinb  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(153)

我有一个简单的Java对象,它有一个String属性,其中包含序列化的Java对象:

@Data
private class Test {
    int id;
    String data;
}

数据是使用

test.setData(mapper.writeValueAsString(anyJavaObjectThatShouldBeSerialized));

然后,我将Test Object发送到另一个服务器,在那里我希望将对象从data属性反序列化为JSONNode:

JsonNode node = mapper.readTree(test.getData());

问题是,readTree的结果是一个TextNode而不是一个JsonNode。因此,我无法访问序列化数据的属性。
问题可能是序列化的对象被解释为String,因为当我打印它时,它周围有引号:

"{\"id\":39,\"name\":\"Im a test value\"}"

如何从包含序列化对象的String中获取JsonNode?请注意,数据可以是ANY Java对象,这就是我将其序列化为String的原因。

wr98u20j

wr98u20j1#

进行两次反序列化-首先将字符串负载反序列化为json,然后将json反序列化为类,或者在您的情况下为JsonNode

public class Temp {

  public static void main(String[] args) throws Exception {
    String payload = //your string payload;
    ObjectMapper mapper = new ObjectMapper();

    String json = mapper.readValue(payload, String.class);
    JsonNode node = mapper.readTree(json);
  }
}

正如您所注意到的,原因是您进行了双重序列化-第一次是在设置data字段时,然后是在向其他服务器发送数据时。
您可以将data设为对象,以避免这种双重序列化/还原序列化。
第一个
像这样,它将被序列化为JsonObject

{
  "id": 39,
  "name": "Im a test value"
}

相关问题