【问题标题】:Having trouble deserialzing null Jackson node to a collection将 null Jackson 节点反序列化到集合时遇到问题
【发布时间】:2017-08-04 14:06:35
【问题描述】:

当我的 JsonNode 没有价值时,我正在测试 deserializingcollection 对象。我希望对象等于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?

【问题讨论】:

    标签: java json jackson objectmapper


    【解决方案1】:

    由于您已经拥有JsonNode,您可以使用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);
    }
    

    请注意,如果您传入一个普通的MapconvertValue()不会按预期工作。在您的情况下,您需要删除 defaultIfNull 并自己检查 null

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

    【讨论】:

    • 嗯,现在我得到了这个异常:java.lang.IllegalArgumentException: Cannot deserialize an instance of java.util.HashSet out of START_OBJECT token at [Source: UNKNOWN;行:-1,列:-1] 我在运行你的 sn-p 时没有得到同样的异常,所以我不知道我的用例有什么问题。
    • 这很奇怪,如果我将 sn-p 作为 JUnit 测试执行,它对我来说运行良好。您使用的是哪个版本的 Jackson?
    • 我编辑了我的评论以表明它确实为我运行,抱歉。我能看到的唯一区别是我实例化了一个 ObjectMapper 来读取树,另一个来获取节点。这可能是我的问题吗?
    • 实际上,我使用 JsonParser 来读取树 - 而不是 ObjectMapper。解析器作为反序列化()签名的一部分。我将编辑我的问题以显示完整的课程。
    • 嗯,请发布更多代码。你显然在做一些与我不同的事情。
    【解决方案2】:

    在我的情况下,我遇到了一些不同的问题,以获得

    Cannot deserialize instance of `java.util.HashSet` out of START_OBJECT token
     at [Source: (String)"{"bbc":"firstbckt","ssg":{"751fad0":"751fad0","be0eb99":"be0eb99"}}"
    

    这是我的 POJO

    import java.io.Serializable;
    import java.util.Map;
    import java.util.Set;
    import java.util.stream.Collectors;
    import com.google.common.collect.Maps;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @SuppressWarnings("serial")
    public class BulkUploadRsp implements Serializable {
        private String bbc;
        private Map<String, String> ssgs = Maps.newHashMap();
        //..
        public void setSsgs(Set<String> ssgs) {
            this.ssgs = ssgs.stream().collect(Collectors.toMap(ssg -> ssg, ssg -> ssg));
        }
    }
    

    问题是:我有这个以set* 开头的 util 方法。将其重命名为 setSsgs(Set&lt;String&gt; ssgs) 有助于解决问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多