我无法使用杰克逊图书馆解组一个可以保存字符串值或另一个JSON对象的JSON密钥。
Ex:-以下是两个可能的值。
1)
"ProviderData": {
"INVALID": "HEX",
"#text": "Sample"
}
2)
"ProviderData": "1C"
有人可以对此问题进行验证并提出建议。
答案 0 :(得分:0)
您可以反序列化为JsonNode
,然后分别提取内容,或者反序列化为Object
,然后使用instanceof
来确定它是Map
还是其他类型,或者使用custom deserializer将数据解压缩到可处理这两种情况的自定义对象中。
答案 1 :(得分:0)
您可以编写自定义反序列化器并处理这两种情况,也可以为ProviderData
POJO
类编写两个构造函数,并正确使用JsonCreator和JsonCreator批注。参见以下示例:
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
public class JsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(jsonFile, Response.class));
}
}
class Response {
@JsonProperty("ProviderData")
private ProviderData data;
// getters, setters, toString
}
class ProviderData {
private static final String INVALID_NAME = "INVALID";
private static final String TEXT_NAME = "#text";
@JsonProperty(INVALID_NAME)
private final String invalid;
@JsonProperty(TEXT_NAME)
private final String text;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public ProviderData(String invalid) {
this(invalid, null);
}
@JsonCreator
public ProviderData(@JsonProperty(INVALID_NAME) String invalid, @JsonProperty(TEXT_NAME) String text) {
this.invalid = invalid;
this.text = text;
}
// getters, toString
}
对于此JSON
有效载荷:
{
"ProviderData": {
"INVALID": "HEX",
"#text": "Sample"
}
}
上面的示例打印:
Response{data=ProviderData{invalid='HEX', text='Sample'}}
对于String
原语JSON
有效载荷:
{
"ProviderData": "1C"
}
上面的示例打印:
Response{data=ProviderData{invalid='1C', text='null'}}
如您所见,JSON Object
使用2-arg
构造函数正确映射,String
原语使用1-arg
构造函数映射,我们假定此值表示{{1} }键,例如invalid
。
另请参阅: