我试图将一些json元素映射到java对象,但似乎无法找出正确的方法。显然有关于如何将json映射到pojos的在线示例,但我有一个很大的JSON字符串,我只想在JSON字符串中映射几个键来构建一个对象......
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
假设我只想要标题和GlossEntry:id,SortAs和Abbrev,
最简洁的是为什么要将它映射到只有那些字段的pojo而不必将整个json映射到对象并获取这些元素
答案 0 :(得分:3)
如果您愿意使用Jackson(一种流行的Java JSON解析器),这个answer可能会为您提供一些见解。这是针对您的问题量身定制的解决方案。
首先定义一个类来保存值:
@JsonIgnoreProperties(ignoreUnknown = true)
public class GlossaryEntry {
@JsonProperty("ID")
private String id;
@JsonProperty("SortAs")
private String sortAs;
@JsonProperty("Abbrev")
private String abbrev;
// Constructor, getters and setters omitted
}
然后将整个JSON解析为JsonNode
ObjectMapper
:
String json = "{\"glossary\":{\"title\":\"example glossary\",\"GlossDiv\":{\"title\":\"S\",\"GlossList\":{\"GlossEntry\":{\"ID\":\"SGML\",\"SortAs\":\"SGML\",\"GlossTerm\":\"Standard Generalized Markup Language\",\"Acronym\":\"SGML\",\"Abbrev\":\"ISO 8879:1986\",\"GlossDef\":{\"para\":\"A meta-markup language, used to create markup languages such as DocBook.\",\"GlossSeeAlso\":[\"GML\",\"XML\"]},\"GlossSee\":\"markup\"}}}}}";
ObjectMapper mapper = new ObjectMapper();
JsonNode tree = mapper.readTree(json);
使用JSON Pointer查询GlossEntry
节点,最后使用ObjectMapper
将其解析为GlossaryEntry
个实例:
JsonNode node = tree.at("/glossary/GlossDiv/GlossList/GlossEntry");
GlossaryEntry glossaryEntry = mapper.treeToValue(node, GlossaryEntry.class);
JSON Pointer是遍历JSON的路径语言。有关详细信息,请查看RFC 6901。自版本2.3以来,它在Jackson中可用。
答案 1 :(得分:1)
使用Google gson library,您可以将json映射到通用的JsonElement。从那里,您可以根据需要访问字段和遍历子对象。
JsonElement elem = new JsonParser.parse(input);
您需要的字段越多越复杂。我建议构建一个反序列化DTO,提供正确的对象层次结构。然后,您可以使用标准映射方法来映射您的json。 在第二步中,您可以将此DTO映射到您自己的域模型。 像ModelMapper这样的项目使这项任务相当容易。