我无法使用 Jackson 库解码可以保存字符串值或另一个 JSON 对象的 JSON 键。
例如:- 以下是两个可能的值。
1)
"ProviderData": {
"INVALID": "HEX",
"#text": "Sample"
}
2)
"ProviderData": "1C"
有人可以验证一下这个问题并给我建议吗?
最佳答案
您可以编写自定义反序列化器并处理这两种情况,或者为 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'}}
如您所见,使用 2-arg
构造函数正确映射 JSON 对象
,使用 1-arg
构造函数映射 String
原语,我们假设该值表示 JSON 对象
示例中的 无效
键。
另请参阅:
关于java - 如何将简单字符串或对象的 JSON 元素解析为类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346210/