使用Jackson-Java将JSON转换为哈希映射

时间:2014-07-01 01:46:02

标签: java json jackson

在此之前标记为重复请阅读问题(我确实看过类似的问题)。谢谢。

为简单起见,假设我有这样的JSON:

{
   "clients" : [
   {
      "name" : "client 1",
      "id" : 1
   },
   {
      "name" : "client 2",
      "id" : 2
   }
],
   "other" : {
      "something" : ""
   }

   ...
}

所以我想创建一个只有客户端及其字段的哈希映射。基本问题是如何使用Jackson方法为客户端的单个JSON数组执行此操作?我试图在网上查看,但我看到的所有示例要么不使用Jackson,要么仅用于单个JSON对象:

HashMap<String, String>[] values = new ObjectMapper().readValue(jsonString, new TypeReference<HashMap<String, String>[]>() {});

我也看过Gson的例子,我知道我可以做一些字符串解析魔术:

jsonSting = jsonString.substring(jsonString.indexOf("["), (jsonString.indexOf("]")+1))

以我可以使用的格式获取它,但我想与Jackson一起尝试以避免导入另一个库。有任何想法吗?


改述问题: 所以,如果我只有这样的客户列表:

jsonString = [{"name" : "client 1","id" : 1},{"name" : "client 2","id" : 2}]

然后我可以这样做:

HashMap[] values = new ObjectMapper().readValue(jsonString, new TypeReference[]>() {});

得到我想要的东西。我基本上问是否有一种方法使用Jackson方法从顶部的大JSON部分获取上面的jsonString。我知道我可以通过字符串解析这个例子很容易地做到这一点,但将来会出现更复杂的情况,字符串解析并不是真正的最佳实践

1 个答案:

答案 0 :(得分:2)

您可以使用the Jackson tree model API提取JSON树的一部分,然后将其转换为地图数组。

以下是一个例子:

public class JacksonReadPart {
    public static final String JSON = "{\n" +
            "   \"clients\" : [\n" +
            "   {\n" +
            "      \"name\" : \"client 1\",\n" +
            "      \"id\" : 1\n" +
            "   },\n" +
            "   {\n" +
            "      \"name\" : \"client 2\",\n" +
            "      \"id\" : 2\n" +
            "   }\n" +
            "],\n" +
            "   \"other\" : {\n" +
            "      \"something\" : \"\"\n" +
            "   }\n" +
            "\n" +
            "}";

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        JsonNode node = mapper.readTree(JSON).path("clients");

        // non type safe
        Map<String, Object>[] clients = mapper.treeToValue(node, Map[].class);
        System.out.println(Arrays.toString(clients));

        // type safe
        JsonParser parser = mapper.treeAsTokens(node);
        clients = parser.readValueAs(new TypeReference<Map<String, Object>[]>() {});
        System.out.println(Arrays.toString(clients));
    }
}

输出:

[{name=client 1, id=1}, {name=client 2, id=2}]
[{name=client 1, id=1}, {name=client 2, id=2}]