如何使用Jackson JSON将JSONstring转换为Map <String,String>
这是我第一次尝试做一些有用的Java ..我试图做这样的事情,但它不起作用:
Map<String, String> propertyMap = new HashMap<String, String>(); propertyMap = JacksonUtils.fromJSON(properties, Map.class);
但IDE说:'未检查的分配Map to Map<String,String>
'
什么是正确的方法来做到这一点? 我只使用jackson,因为这是项目中已有的东西,有没有Java转换到/从JSON的本地Java方式?
在PHP中,我只是简单的json_decode($str)
,我会得到一个数组。 我在这里需要基本相同的东西。
谢谢!
我有以下代码:
public void testJackson() throws IOException { ObjectMapper mapper = new ObjectMapper(); File from = new File("albumnList.txt"); TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {}; HashMap<String,Object> o = mapper.readValue(from, typeRef); System.out.println("Got " + o); }
它从一个文件读取,但是mapper.readValue()
也会接受一个InputStream
,你可以使用下面的方法从一个string中获得一个InputStream
:
new ByteArrayInputStream(astring.getBytes("UTF-8"));
关于我的博客上的映射器有更多的解释。
试试TypeFactory
。 这里是Jackson JSON(2.8.4)的代码。
Map<String, String> result; ObjectMapper mapper; TypeFactory factory; MapType type; factory = TypeFactory.defaultInstance(); type = factory.constructMapType(HashMap.class, String.class, String.class); mapper = new ObjectMapper(); result = mapper.readValue(data, type);
这是Jackson JSON旧版本的代码。
Map<String, String> result = new ObjectMapper().readValue( data, TypeFactory.mapType(HashMap.class, String.class, String.class));
警告你通过编译器完成,而不是通过库(或者实用程序方法)完成。
直接使用jackson的最简单的方法是:
HashMap<String,Object> props; // src is a File, InputStream, String or such props = new ObjectMapper().readValue(src, new TypeReference<HashMap<String,Object>>() {}); // or: props = (HashMap<String,Object>) new ObjectMapper().readValue(src, HashMap.class); // or even just: @SuppressWarnings("unchecked") // suppresses typed/untype mismatch warnings, which is harmless props = new ObjectMapper().readValue(src, HashMap.class);
您调用的实用程序方法可能只是做类似的事情。
ObjectReader reader = new ObjectMapper().readerFor(Map.class); Map<String, String> map = reader.readValue("{\"foo\":\"val\"}");
请注意, reader
实例是线程安全的。
从string转换为JSON地图:
Map<String,String> map = new HashMap<String,String>(); ObjectMapper mapper = new ObjectMapper(); map = mapper.readValue(string, HashMap.class);
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class); Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);
我想这会解决你的问题。
以下为我工作:
Map<String, String> propertyMap = getJsonAsMap(json);
getJsonAsMap
的定义如下所示:
public HashMap<String, String> getJsonAsMap(String json) { try { ObjectMapper mapper = new ObjectMapper(); TypeReference<Map<String,String>> typeRef = new TypeReference<Map<String,String>>() {}; HashMap<String, String> result = mapper.readValue(json, typeRef); return result; } catch (Exception e) { throw new RuntimeException("Couldnt parse json:" + json, e); } }
请注意,如果您的json中有子对象(因为它们不是一个String
,它们是另一个HashMap
), 则会失败,但是如果您的json是像以下这样的属性的关键值列表,
{ "client_id": "my super id", "exp": 1481918304, "iat": "1450382274", "url": "http://www.example.com" }
为什么不使用这里提到的谷歌的Gson。
很简单,为我做了这个工作:
HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());