猿问

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

给定json:


{

  "name" : {}

}

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


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不更改属性类型(来自字符串)的情况下处理这些?


MM们
浏览 136回答 3
3回答

浮云间

为此,您可以编写自己的反序列化器。在此之后,您扩展 StdDeserializer 并将其注册到类中。作者编辑:我已经为字符串使用了以下反序列化器,它工作正常,谢谢:public class EmptyObjectDeserializer extends StdDeserializer<String> {&nbsp; &nbsp; public EmptyObjectDeserializer() {&nbsp; &nbsp; &nbsp; &nbsp; this(null);&nbsp; &nbsp; }&nbsp; &nbsp; public EmptyObjectDeserializer(Class<?> vc) {&nbsp; &nbsp; &nbsp; &nbsp; super(vc);&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {&nbsp; &nbsp; &nbsp; &nbsp; JsonNode node = jp.getCodec().readTree(jp);&nbsp; &nbsp; &nbsp; &nbsp; return node.asText("");&nbsp; &nbsp; }}

精慕HU

在 json 中,{}is anObject意味着它可以有字段(就像 Java 中的 POJO)。当您尝试将其反序列化为 aString时,它会引发异常(想象一下尝试将 POJO 分配给 Java 中的 String 引用)。在这种情况下,有两种选择:将您的课程配置为不包含空字段。这可以通过ObjectMapper实例上的注释或配置来完成,例如:@JsonInclude(Include.NON_NULL)class MyClass {&nbsp; private String name;}或者mapper.setSerializationInclusion(Include.NON_EMPTY);如果响应中没有 null,则此选项可能不起作用name。如果它是一个非空值的对象,Jackson 将尝试将其反序列化为 aString并失败。将类型更改name为Object(或者更确切地说,是响应可以包含的所有元素的 POJO)。但是,这意味着您需要更改访问name元素的代码,因为它不再是String.

守着星空守着你

无需编写自己的反序列化器,只需将名称对象封装在一个类中即可:@JsonInclude(JsonInclude.Include.NON_NULL)@JsonPropertyOrder({&nbsp; &nbsp; &nbsp; &nbsp; "name"})public class JsonExample {&nbsp; &nbsp; &nbsp; &nbsp; @JsonProperty("name")&nbsp; &nbsp; &nbsp; &nbsp; public Name name;}和@JsonInclude(JsonInclude.Include.NON_NULL)@JsonPropertyOrder({&nbsp; &nbsp; &nbsp; &nbsp; "first",&nbsp; &nbsp; &nbsp; &nbsp; "last"})public class Name {&nbsp; &nbsp; @JsonProperty("first")&nbsp; &nbsp; public String first_name;&nbsp; &nbsp; @JsonProperty("last")&nbsp; &nbsp; public String last_name;}这里以名字和姓氏为例...不知道 Name 对象中的内容,因此您可以使用映射器:JsonExample obj = mapper.readValue(file, JsonExample.class);
随时随地看视频慕课网APP

相关分类

Java
我要回答