给出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>
答案 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);