2013-12-11 2 views
3

String 필드에 JSON 객체가 포함되어 있으면 JSON으로 직렬화하려고합니다. 이를 위해 나는 사용자 정의 시리얼 썼다 :JSON 필드를 JSON으로 serialize

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.writeRaw (value); 대신'jsonGenerator.writeString (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인지 아닌지 확실하지 않은 경우 문자 그대로 String입니다. 그리고 선행 {또는 후행}에 대한 검사가 내용이 유효한 JSON이라는 것을 의미하지는 않습니다. – jdevelop

+0

{}을 검사하는 것만으로는 충분하지 않지만 구문 분석을 시도 할 수 있으며 통과하면 충분합니다. 그렇지 않다면 문자열로 쓸 수 있습니다. 가능한 한 간단하게 예제의 논리를 유지하려고했습니다. –

관련 문제