2017-08-04 2 views
0

Je suis en train de tester deserializing pour un objet collection lorsque mon JsonNode n'a aucune valeur. Je veux que l'objet soit égal à null.Problème lors de la désérialisation d'un noeud Jackson vers une collection

C'est ce que je suis en train:

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>>() {}); 
} 

Mais je reçois un MismatchedInputException, indiquant qu'il n'y a pas de contenu à la carte. Comment obtenir le ObjectMapper pour renvoyer un null?

Répondre

1

Puisque vous avez déjà un JsonNode vous pouvez utiliser 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); 
} 

Notez que convertValue() sera pas fonctionnent comme prévu si vous passez dans une Map plaine. Dans votre cas, vous devez supprimer defaultIfNull et vérifier null vous:

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

Hmm, maintenant je cette exception: java.lang.IllegalArgumentException: ne peut pas désérialiser instance de java.util.HashSet sur jeton START_OBJECT à [ Source: UNKNOWN line: -1, column: -1] Je ne reçois pas la même exception quand je cours votre extrait, donc je ne sais pas quel est le problème avec mon cas d'utilisation. – user1660256

+0

C'est bizarre, l'extrait fonctionne bien pour moi, si je l'exécute comme un test JUnit. Quelle version de Jackson utilisez-vous? – hzpz

+0

J'ai édité mon commentaire pour montrer qu'il a fonctionné réellement pour moi, désolé. La seule différence que je peux voir est que j'instancie un ObjectMapper pour lire l'arbre, et un autre pour obtenir le nœud. Cela peut-il être mon problème? – user1660256