将动态 JSON 数据映射到 Java 中的 pojo class?
Map dynamic JSON data to pojo class in Java?
我正在创建一个生成和使用 Json 数据的 crud 表单。
问题:
Json 我生成的数据非常动态。所以我不知道如何将它映射到我的 pojo class.
我试过的
1) Using jackson library, I created structure of my json data and
tried mapping with it. It failed as in data "**Keys**" are dynamic so mapping failed.
2) I searched and found JsonNode provided by Jackson, problem with
this is my json structure has key:[{},{}] structure like this
**key-->array of objects**, so I tried parsing it with json node but failed.
我的Json数据
类型 1
{
"city_master": [
{
"citycode": [
"100",
"1130385"
]
},
{
"cityname": [
"London",
"1130383"
]
},
{
"statecode": [
"512",
"1130382"
]
}
]
}
结构问题在于 key = "city_master" 或此格式的任何键,例如("citycode"、"cityname" 等)是动态的,因此无法为此创建映射 pojo class.
然后我尝试将外键固定为 root 并解析为 Json 节点为
类型 2
{
"root": [
{
"citycode": [
"100",
"1130385"
]
},
{
"cityname": [
"London",
"1130383"
]
},
{
"statecode": [
"512",
"1130382"
]
}
]
}
在这个结构中,我丢失了我的键值,但我可以将它存储在其他地方。
使用 JsonNode (Type-2) 我试过这个
String jsonString = tdObj.getTempData(); // return's Json String
TempDataTblPojo obj = new ObjectMapper().readValue(jsonString, TempDataTblPojo.class);
JsonNode jsonNode = obj.getRoot();
System.out.println("Name = " + jsonNode);
这个classTempDataTblPojo
public class TempDataTblPojo {
private JsonNode root;
public JsonNode getRoot() {
return root;
}
public void setRoot(JsonNode root) {
this.root = root;
}
}
它打印这个
Name = [{"citycode":["100","1130385"]},{"cityname":["London","1130383"]},{"statecode":["512","1130382"]}]
现在如何解析这个Json节点,得到所有的键值对?或者是否有高效或更清洁的解决方案,我很乐意接受。
也许这会对你有所帮助。
class Pojo {
private List<PojoItem> root;
public List<PojoItem> getRoot() {
return root;
}
public void setRoot(List<PojoItem> root) {
this.root = root;
}
}
class PojoItem {
private Map<String, List<String>> items = new HashMap<>();
public Map<String, List<String>> getItems() {
return items;
}
@JsonAnySetter
public void setItem(String key, List<String> values) {
this.items.put(key, values);
}
}
然后您可以使用以下方法从 json 获取它:
Pojo result = objectMapper.readValue(json, Pojo.class);
我正在创建一个生成和使用 Json 数据的 crud 表单。
问题: Json 我生成的数据非常动态。所以我不知道如何将它映射到我的 pojo class.
我试过的
1) Using jackson library, I created structure of my json data and
tried mapping with it. It failed as in data "**Keys**" are dynamic so mapping failed.
2) I searched and found JsonNode provided by Jackson, problem with
this is my json structure has key:[{},{}] structure like this
**key-->array of objects**, so I tried parsing it with json node but failed.
我的Json数据
类型 1
{
"city_master": [
{
"citycode": [
"100",
"1130385"
]
},
{
"cityname": [
"London",
"1130383"
]
},
{
"statecode": [
"512",
"1130382"
]
}
]
}
结构问题在于 key = "city_master" 或此格式的任何键,例如("citycode"、"cityname" 等)是动态的,因此无法为此创建映射 pojo class.
然后我尝试将外键固定为 root 并解析为 Json 节点为
类型 2
{
"root": [
{
"citycode": [
"100",
"1130385"
]
},
{
"cityname": [
"London",
"1130383"
]
},
{
"statecode": [
"512",
"1130382"
]
}
]
}
在这个结构中,我丢失了我的键值,但我可以将它存储在其他地方。
使用 JsonNode (Type-2) 我试过这个
String jsonString = tdObj.getTempData(); // return's Json String
TempDataTblPojo obj = new ObjectMapper().readValue(jsonString, TempDataTblPojo.class);
JsonNode jsonNode = obj.getRoot();
System.out.println("Name = " + jsonNode);
这个classTempDataTblPojo
public class TempDataTblPojo {
private JsonNode root;
public JsonNode getRoot() {
return root;
}
public void setRoot(JsonNode root) {
this.root = root;
}
}
它打印这个
Name = [{"citycode":["100","1130385"]},{"cityname":["London","1130383"]},{"statecode":["512","1130382"]}]
现在如何解析这个Json节点,得到所有的键值对?或者是否有高效或更清洁的解决方案,我很乐意接受。
也许这会对你有所帮助。
class Pojo {
private List<PojoItem> root;
public List<PojoItem> getRoot() {
return root;
}
public void setRoot(List<PojoItem> root) {
this.root = root;
}
}
class PojoItem {
private Map<String, List<String>> items = new HashMap<>();
public Map<String, List<String>> getItems() {
return items;
}
@JsonAnySetter
public void setItem(String key, List<String> values) {
this.items.put(key, values);
}
}
然后您可以使用以下方法从 json 获取它:
Pojo result = objectMapper.readValue(json, Pojo.class);