2017-03-11 6 views
1

以下のような:使用ジャクソン

{ "value":{} } 

マイモデルPOJOクラスは、この

public class Hello { 

    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

問題私のように見えます

JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token. 

私の質問は、ジャクソンが成功するにはどうすればよいです:それは例外がスローされますので、ジャクソンはObjectを読み込むしようとしているが、私のモデルクラスのフィールドは文字列です:応答は{{}値}のように見えたときにということです

{"value":"something"} 

、応答は次のようになり、同時に場合{「値」:{}}のように見えるJSONs読んで(私のために空の応答を)、私のこんにちは、モデルクラスの値フィールドにnullを渡します。

私は、JSON文字列を読み取るために以下のコードを使用しています:

String myJsonAsString = "{...}"; 
ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(myJsonAsString , Hello.class); 
+0

醜いデザインではなく、このJSONを生成する部分を修正する方法はありませんか? –

+0

いいえ、残念ながらそれはありません。 APIは私のものではありません。私はクライアント側です。 –

+0

ああ、適切な出力は、フィールドを省略するか、nullに設定します... – john16384

答えて

3

あなたはこのフェルドにカスタムデシリアライザを使用することができます。文字列がある場合はそれを返します。それ以外の場合はnullを返します。

public class Hello { 

    @JsonDeserialize(using = StupidValueDeserializer.class) 
    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

public class StupidValueDeserializer extends JsonDeserializer<String> { 
    @Override 
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { 
     JsonToken jsonToken = p.getCurrentToken(); 
     if (jsonToken == JsonToken.VALUE_STRING) { 
      return p.getValueAsString(); 
     } 
     return null; 
    } 
} 
+0

ありがとう、それは私のケースを完全に解決します。 –

関連する問題