将json转换为对应的HashMap

Convert json to corresponding HashMap

当使用 gson 将 json 转换为 Map 时,我们拥有所有值为 String 或 Boolean 的 LinkedTreeMap 实例...偶数被转换为 String...

Gson gson = new GsonBuilder().create();
Map<String, Object> result = gson.fromJson(EXAMPLE, new TypeToken<Map<String,Object>>() {}.getType());

我们如何将 json 转换为具有相应原始包装器的最简单的 HashMap?在这种情况下性能也非常重要...我想尽可能少地创建垃圾并重新使用解析器...

有没有办法使用 gson 做到这一点?或任何其他库?

请不要建议为每个 json 创建特殊的 java 类型...我宁愿通过地图导航...

这是一个例子

{                           // Hashmap (as no ordering or sorting is essential)
  "bool": true,             // Boolean
  "string": "string",       // String
  "int" : 123,              // Long for all non floats are ok but if possible i'd like this to be Integer if it fits, otherwise Long
  "long" : 100000000000000, // Long if Integer cant contain the number...
  "double" : 123.123435,    // all floating point nubmers will just map to Double
  "object" : {              // another HashMap
    ...
  }
  "array" : [               // Array or some collection like ArrayList or LinkedList
    ...
  ]
}

目标是尽快将任何 json 转换为 java 映射(或数组,如果 json 的根是数组) 然后使用一些访问器方法来访问数据...而不是为每个可能的 json 结构发明 java 类型...

适用于 Jackson Databind 库:

ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = mapper.readValue(jsonString, Map.class);

地图中的值将具有相应的类型。 此测试通过:

    @Test
    public void test() throws Exception {
        String jsonString = "{\"bool\": true,"
                + "\"str\":\"strv\","
                + "\"long\": 100000000000000}";
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> map = mapper.readValue(jsonString , Map.class);

        assertEquals(Long.class, map.get("long").getClass());
        assertEquals(Boolean.class, map.get("bool").getClass());
    }