1

使用杰克逊,我如何安全地将 JsonNode 转换为 JSON 字符串。

public class WrappedMessage extends JsonDeserializer<WrappedMessage> {
    @Override
    public WrappedMessage deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException {
        ObjectCodec codec = jp.getCodec();

        JsonNode node = codec.readTree(jp);
        JsonNode payload = node.get("payload");
        // How to get the payload as JSON

        return new WrappedMessage();
    }
}

可以这样做,ObjectMapper#writeValueAsString并且我知道在正常情况下ObjectCode可以强制转换为ObjectMapper,但似乎不是很干净。

也可以这样做payload.toString(),但文档指出:

将生成节点的开发人员可读表示的方法;这可能是也可能不是有效的 JSON。如果您想要有效的 JSON 输出(或使用 Jackson 支持的其他数据格式之一格式化输出),请确保使用 {@link ObjectMapper} 或 {@link ObjectWriter} 来序列化实例,例如: String json = objectMapper.writeValueAsString(rootNode );

所以这也不安全。

我看到的最后一种可能性是构建一个新的ObjectMapper,但对我来说似乎不是很有效。

4

1 回答 1

2

一种可能性是创建一个JsonGenerator并使用ObjectCodec.writeTree

StringWriter writer = new StringWriter();
JsonGenerator jgen = codec.getFactory().createGenerator(writer);    
codec.writeTree(jgen, payload);
String jsonPayload = writer.toString();
于 2017-12-11T15:30:32.593 回答