Java 将JSON字段序列化为JSON
如果字符串字段包含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)
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);
}
}
}