Jackson ObjectCodec 到字符串 json

Jackson ObjectCodec to string json

Jackson 如何安全地将 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(),但文档说明:

Method that will produce developer-readable representation of the node; which may or may not be as valid JSON. If you want valid JSON output (or output formatted using one of other Jackson supported data formats) make sure to use {@link ObjectMapper} or {@link ObjectWriter} to serialize an instance, for example: String json = objectMapper.writeValueAsString(rootNode);

所以这也不安全。

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

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

StringWriter writer = new StringWriter();
JsonGenerator jgen = codec.getFactory().createGenerator(writer);    
codec.writeTree(jgen, payload);
String jsonPayload = writer.toString();