3 回答

TA贡献1829条经验 获得超4个赞
为此,您可以编写自己的反序列化器。在此之后,您扩展 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("");
}
}

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

TA贡献1799条经验 获得超8个赞
无需编写自己的反序列化器,只需将名称对象封装在一个类中即可:
@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);
添加回答
举报