[英]How to deserialize this dynamic keys JSON to Java custom Pojo using Jackson
我有一个非常复杂的 json 字符串,我想将其反序列化为自定义 Java Pojo,但我不太确定该怎么做。
这是 json:
{
"A": {
"view": {
"1": ["stringA", "stringB"],
"2": ["stringA", "stringB"],
"3": ["stringA", "stringB"]
},
"list": ["stringA", "StringB"]
},
"B": {
"view": {
"1": ["stringA", "stringB"],
"2": ["stringA", "stringB"],
"3": ["stringA", "stringB"]
},
"list": ["stringA", "StringB"]
}
}
请注意,与list
相比, view
key 有一个额外的嵌套。
任何帮助都会很棒!
编辑2:
让我们尝试将我的问题简化为更简单的 JSON,如下所示:
{
"view": {
"1": ["stringA", "stringB"],
"2": ["stringA", "stringB"],
"3": ["stringA", "stringB"]
},
"list": ["stringC", "stringD"]
}
这是我的 Pojo:
public class Model {
private final Map<String, List<String> modelView;
private final List<String> modelList;
@JsonCreator
public ModelView(@JsonProperty("view") Map<String, List<String>>
modelView, @JsonProperty("list") List<String> modelList) {
this.modelView = modelView;
this.modelList = modelList;
}
public Map<String, List<String>> getModelView() {
return modelView;
}
public List<String> getModelList() {
return modelList;
}
}
和我的测试代码:
@Test
public void testSerialization() throws Exception {
try {
JSONObject json = new JSONObject(json1Str());
ObjectMapper mapper = new ObjectMapper();
Model model = mapper.readValue(json.toString(), Model.class);
System.out.println(model.getModelView());
} catch (Exception e) {
e.printStackTrace();
}
}
它不起作用......对此有什么想法吗?
要使用动态密钥反序列化 JSON,您可以使用 Jackson 库中的@JsonAnySetter注释。 它会将您的键添加到映射到 Java Map 的值中。
public class DyanamicJson {
private Map<String, Object> dynamicKeys = new HashMap<>();
@JsonAnySetter
public void setUnknownFields(String name, Object value) {
dynamicKeys.put(name, value);
}
public Map<String, Object> getFieldsMap() {
return dynamicKeys;
}
}
这是最后的 model class,希望这能帮助别人......
public class LangModel {
private final Map<String, Model> langModel;
@JsonCreator
public LangMode(Map<String, Model> langModel) {
this.langModel = langModel;
}
public LangModel getLangModel() {
return langModel;
}
public static class Model {
private final Map<String, List<String> modelView;
private final List<String> modelList;
@JsonCreator
public ModelView(@JsonProperty("view") Map<String, List<String>>
modelView, @JsonProperty("list") List<String> modelList) {
this.modelView = modelView;
this.modelList = modelList;
}
public Map<String, List<String>> getModelView() {
return modelView;
}
public List<String> getModelList() {
return modelList;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.