将JSON映射到Java Object的正确方法

时间:2017-02-19 09:02:17

标签: java json

我试图将一些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映射到对象并获取这些元素

2 个答案:

答案 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这样的项目使这项任务相当容易。