2017-08-04 9 views
0

JsonNodeの値がない場合、deserializingからcollectionオブジェクトにテストしています。私はオブジェクトがnullと等しくなるようにしたい。nullジャクソンノードをコレクションにデシリアライズする際に問題が発生しました

public class ImmutableDiscoveredUrlDeserializer extends JsonDeserializer<ImmutableDiscoveredUrl> { 
String parentUrl; 
Double parentUrlSentiment; 
Set<String> childUrls; 
Boolean isParentVendorUrl; 
Map<TagClassification, Set<String>> parentUrlArticleTags; 

/* 
* (non-Javadoc) 
* @see com.fasterxml.jackson.databind.JsonDeserializer#deserialize(com.fasterxml.jackson.core.JsonParser, com.fasterxml.jackson.databind.DeserializationContext) 
*/ 
@Override 
public ImmutableDiscoveredUrl deserialize(JsonParser p, DeserializationContext ctx) 
    throws IOException { 

    JsonNode node = p.readValueAsTree(); 
    parentUrl = defaultIfNull(node.get("parentUrl").asText(), null); 
    childUrls = defaultIfNull(parseChildUrls(node), emptySet()); 
    isParentVendorUrl = defaultIfNull(Boolean.valueOf(node.get("isParentVendorUrl").asText()), null); 
    parentUrlArticleTags = defaultIfNull(parseArticleTags(node.get("parentUrlArticleTags")), emptyMap()); 

    return ImmutableDiscoveredUrl.discoveredUrl().parentUrl(parentUrl) 
       .parentUrlSentiment(parentUrlSentiment).childUrls(childUrls) 
      .isParentVendorUrl(isParentVendorUrl).parentUrlArticleTags(parentUrlArticleTags); 
} 

private Set<String> parseChildUrls(JsonNode node) throws IOException { 
    ObjectMapper tagsMapper = new ObjectMapper(); 
    return tagsMapper.convertValue(node, new TypeReference<Set<String>>() {}); 
} 

private Map<TagClassification, Set<String>> parseArticleTags(JsonNode node) throws IOException { 
    ObjectMapper tagsMapper = new ObjectMapper(); 
    return tagsMapper.convertValue(node, new TypeReference<Set<String>>() {}); 
} 

をしかし、私はMismatchedInputExceptionを取得し、マップするコンテンツがありませんという内容:

これは私がしようとしているものです。 ObjectMapperにnullを返すにはどうすればよいですか?すでにJsonNodeを持っているので

答えて

1

あなたがObjectMapper#convertValueを使用することができます。

@Test 
public void converts_null_to_null() throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    JsonNode jsonNode = mapper.readTree("{\"foo\":null}"); 
    JsonNode foo = jsonNode.get("foo"); 

    Set<String> result = mapper.convertValue(foo, new TypeReference<Set<String>>() {}); 

    assertNull(result); 
} 

convertValue()その意志あなたは、プレーンMapに渡すと意図したとおりではない作品。あなたのケースでは、あなたは自分をdefaultIfNullを削除し、nullをチェックする必要があります:java.lang.IllegalArgumentExceptionが::

if (node.get("parentUrlArticleTags") !== null) { 
    parentUrlArticleTags = parseArticleTags(node.get("parentUrlArticleTags")); 
} 
+0

うーん、今私は、この例外を取得でSTART_OBJECTトークン の外にはjava.util.HashSetのインスタンスをデシリアライズすることはできませんが、[ソース:UNKNOWN; line:-1、column:-1]スニペットを実行するときに同じ例外が発生することはないので、私のユースケースで何が問題なのか分かりません。 – user1660256

+0

これは変ですが、JUnitテストとして実行すると、スニペットはうまく動作します。ジャクソンのどのバージョンを使用していますか? – hzpz

+0

私は実際に私のために走ったことを示すために私のコメントを編集しました、申し訳ありません。私が見ることのできる唯一の違いは、ツリーを読み取るためにObjectMapperをインスタンス化し、ノードを取得するために別のObjectMapperをインスタンス化することです。それは私の問題だろうか? – user1660256

関連する問題