2016-04-08 11 views
0

私は穏やかなWebサービスをヒットし、非標準のJSONを取り戻すために、SpringのRestTemplateを使用しています。標準以外のJSONのカスタムカスタムオブジェクトMapper

{ 
    ... 
    rules : { 
     matched : "rule one", 
     matched : "rule B", 
     matched : "another rule" 
    } 
    ... 
} 

だから、基本的に、私はリストにマッピングされ、このハッシュが必要になります。ここでは

は、私が何を意味するかです。私のpojoでは、フィールドは次のようになります:

private List<String> rules; // once parsed, should contain "rule one", 
        // "rule B", "another rule", etc 

これまで私が試したことはこれまでにあります。 は、ここに私のシリアライザです:

import com.fasterxml.jackson.core.JsonGenerator; 
import com.fasterxml.jackson.databind.JsonSerializer; 
import com.fasterxml.jackson.databind.SerializerProvider; 

public class MapValuesToListSerializer extends JsonSerializer<Map<?, ?>> { 

    @Override 
    public void serialize(Map<?, ?> map, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { 
     serializerProvider.defaultSerializeValue(map.values(), jsonGenerator); 
    } 
} 

そして、私のPOJOの中に、私はこのように私のフィールドを注釈を付けました:これは動作しません

@JsonSerialize(using = MapValuesToListSerializer.class) 
private List<String> rules; 

。標準フィールドはすべて正しくシリアル化されますが、このフィールドに準拠している非標準フィールドは正しくシリアル化されません。私はこれに重要な部分を欠いているが、私は何がわからない。

+2

"非標準JSON" のようなものはありません。それはJSONかそうでないかのどちらかです。それは本当にあなたがウェブサービスから得ているものですか?まったくのことではありません。識別子は引用されていません。それがジャクソンと解析可能であったとしても、私はカスタム**シリアライザ**が**デシリアライズ**をどのように助けるか分かりません。 –

+0

代替手段として何をお勧めしますか?私はこのデータを一方的に変える必要があり、ジャクソンはこれを部分的に読んでいるので、それを出発点として使用することは合理的な仮定のようです。 –

+0

私はJSONを返すはずのWebサービスには依存しませんが、そうではありません。それがあなたのWebサービスの1つであれば、修正してください。そうでない場合は、Webサービスプロバイダに、有効なJSONを返すようにWSを修正するか、独自の独自の形式、または少なくともその独自の形式の仕様を解析できるパーサーを用意するよう依頼してください。 –

答えて

0

私はJB Nizetと完全に同意しますが、「自分のWebサービスの場合は修正してください。これは、私の把握の中にある力であるために、ただのものではありません。私ができるならば、そうでなければ、それは私には及ばない。 (これには個人的な帯域幅を修正する必要はありませんし、他のnSizeダウンストリームの問題も原因になります)。

幸い、ジャクソンにはこれを行うツールが付属しています。フィールドで

@JsonProperty("rules") 
@JsonDeserialize(as = List.class, using = BadmapToListDeserializer.class) 
private List<String> rules; 

実際デシリアライザ:

public class BadmapToListDeserializer extends JsonDeserializer<List<String>> { 
    @Override 
    public List<String> deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException { 
     List<String> valuesList = new ArrayList<>(); 
     for (JsonToken jsonToken = jsonParser.nextToken(); jsonToken != JsonToken.END_OBJECT; jsonToken = jsonParser.nextToken()) { 
      if (jsonToken == JsonToken.VALUE_STRING) { 
       String value = jsonParser.getText(); 
       valuesList.add(value); 
      } 
     } 
     return valuesList; 
    } 
} 
関連する問題