如何解析“ {}”空值(转换为字符串)

时间:2019-01-30 09:12:35

标签: java json jackson fasterxml

给出json:

{
  "name" : {}
}

我想使用com.fasterxml.jackson将其解析为以下Java对象:

class MyClass {
  private String name;
}

如果尝试,您将获得:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token

是否有任何方法可以配置杰克逊解串器(全局最佳),它可以将这些empty objects处理为nulls而无需更改属性类型(来自String)? < / p>

3 个答案:

答案 0 :(得分:0)

为此,您可以编写自己的解串器。在this之后,扩展StdDeserializer并将其注册到类中。


作者编辑:

我对字符串使用了以下反序列化器,它工作正常,谢谢:

public class EmptyObjectDeserializer extends StdDeserializer<String> {

    public EmptyObjectDeserializer() {
        this(null);
    }

    public EmptyObjectDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        return node.asText("");
    }
}

答案 1 :(得分:0)

在json中, for a in row[2].findAll('span')[1] : ## [1] means getting the second span tag print a['data-odd'] {},表示它可以具有字段(如Java中的POJO)。当您尝试将其反序列化为Object时,它会引发异常(想象一下,尝试在Java中将POJO分配给String引用)。

在这种情况下,有两个选项:

  • 配置您的班级不包括空字段。这可以通过在您的String实例上进行注释或配置来完成,例如:

    ObjectMapper

    OR

    @JsonInclude(Include.NON_NULL) class MyClass { private String name; }

    如果响应中不包含空mapper.setSerializationInclusion(Include.NON_EMPTY);,则此选项可能不起作用。如果它是一个不为null值的对象,Jackson将尝试将其反序列化为name并失败。

  • String的类型更改为name(或者,具有响应所有元素可以包含的POJO)。但是,这意味着您需要更改访问Object元素的代码,因为它将不再是name

答案 2 :(得分:0)

无需编写自己的反序列化器,只需将您的name对象封装在一个类中即可使用:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "name"
})
public class JsonExample {
        @JsonProperty("name")
        public Name name;
}

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "first",
        "last"
})
public class Name {
    @JsonProperty("first")
    public String first_name;
    @JsonProperty("last")
    public String last_name;
}

这里以名字和姓氏为例...不知道Name对象中的内容 所以你可以使用你的映射器:

JsonExample obj = mapper.readValue(file, JsonExample.class);