Java 将JSON字段序列化为JSON

Java 将JSON字段序列化为JSON,java,json,serialization,jackson,Java,Json,Serialization,Jackson,如果字符串字段包含JSON对象,我将尝试将其序列化为JSON。为此,我编写了一个自定义序列化程序: public class TryJsonStringSerializer extends JsonSerializer<String> { @Override public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)

如果字符串字段包含JSON对象,我将尝试将其序列化为JSON。为此,我编写了一个自定义序列化程序:

public class TryJsonStringSerializer extends JsonSerializer<String> {
    @Override
    public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
            throws IOException, JsonProcessingException {
        if (value == null) {
            return;
        }
        value = value.trim();
        if (value.startsWith("{") && value.endsWith("}")) {
            jsonGenerator.writeRaw(value);
        } else {
            jsonGenerator.writeString(value);
        }
    }

}

实现这一点的最佳方法是什么?

您可能需要使用特殊注释:@JsonRawValue,请参阅公共类TryJsonStringSerializer extends JsonSerializer{ 私有RawSerializer RawSerializer=新的RawSerializer(String.class); 私有ToString Serializer stringSerializer=ToString Serializer.instance; @凌驾 公共void序列化(字符串值,JsonGenerator JsonGenerator,SerializerProvider SerializerProvider) 抛出IOException、JsonProcessingException{ 如果(值==null){ 返回; } value=value.trim(); if(value.startsWith(“{”)&&value.endsWith(“}”)){ serialize(值、jsonGenerator、serializerProvider); }否则{ serialize(值、jsonGenerator、serializerProvider); } } }
上述异常跟踪没有显示您的方法。你确定这就是失败的地方吗?如果我把
jsonGenerator.writeString(value)
而不是
jsonGenerator.writeRaw(值)一切正常。如果它不是有效的JSON,我仍然希望将其视为字符串。我怎样才能做到这一点呢?也许有办法做到这一点,但我最好将这种逻辑转移到序列化和相关内容之外。如果您不确定是否存在有效的JSON,那么它就是字符串。检查前导{或尾随}并不意味着内容是有效的JSON。检查{}是不够的,但我可以尝试解析它,如果通过了,就应该足够了。如果没有,我可以把它写成字符串。我试图尽可能简单地维护示例中的逻辑。我建议要么通过添加JSON和String类型的额外字段来对某个基类进行子类化,要么(我的首选方式)使用泛型属性创建某个聚合类。这样就更容易理解您使用的是-JSON对象还是纯字符串。拥有一些“神奇”的对象,这些对象在不同的内容中表现出不同的方式,这从来都不是一个好主意。嗯,我找到了一个方法,但是你的观察结果很好+1.
org.codehaus.jackson.JsonGenerationException: Can not write a field name, expecting a value
org.codehaus.jackson.impl.JsonGeneratorBase._reportError(JsonGeneratorBase.java:480)
org.codehaus.jackson.impl.Utf8Generator.writeFieldName(Utf8Generator.java:292)
org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:422)
org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)
org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)
org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:122)
org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:71)
org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86)
org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:610)
org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256)
org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1613)
...
public class TryJsonStringSerializer extends JsonSerializer<String> {

    private RawSerializer<String> rawSerializer = new RawSerializer<String>(String.class);
    private ToStringSerializer stringSerializer = ToStringSerializer.instance;

    @Override
    public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
            throws IOException, JsonProcessingException {
        if (value == null) {
            return;
        }
        value = value.trim();
        if (value.startsWith("{") && value.endsWith("}")) {
            rawSerializer.serialize(value, jsonGenerator, serializerProvider);
        } else {
            stringSerializer.serialize(value, jsonGenerator, serializerProvider);
        }
    }

}