2013-12-11 42 views
3

我想串行化一個字符串字段作爲JSON,如果它包含一個JSON對象。爲此,我寫了一個自定義序列:序列化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); 
     } 
    } 

} 

,但我得到了以下錯誤:

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) 
... 

什麼將是實現這一目標的最佳方式是什麼?

+0

上述異常跟蹤不會顯示你的方法。你確定這是失敗的嗎? –

+0

如果我把'jsonGenerator.writeString(value);'而不是'jsonGenerator.writeRaw(value);'一切正常。 –

回答

6
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); 
     } 
    } 

} 
+0

節省了大量的時間。謝謝 :) – SSR

1

您可能需要使用特殊的註釋:@JsonRawValue,看docs

+0

我想仍然把它當作一個字符串,如果它不是一個有效的JSON。我怎樣才能做到這一點? –

+0

也許有這樣做的一些方法,但我最好把這個邏輯移到序列化和相關的東西之外。如果你不確定是否有一個有效的JSON,那麼它的字面意思就是。並且您對領先{或結尾}的檢查並不意味着該內容是有效的JSON。 – jdevelop

+0

檢查{}是不夠的,但我可以嘗試解析它,如果通過,它應該就足夠了。如果不是,我可以把它寫成一個字符串。我試圖保持示例中的邏輯儘可能簡單。 –