如何使用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());