我试着做一些这样的事情,但它不起作用:

Map<String, String> propertyMap = new HashMap<String, String>();

propertyMap = JacksonUtils.fromJSON(properties, Map.class);

但是IDE说:

未检查映射到映射<字符串,字符串>

正确的做法是什么? 我只使用杰克逊,因为这是什么已经在项目中,有一个本地Java的方式转换到/从JSON?

在PHP中,我将简单地json_decode($str),我将返回一个数组。我在这里也需要同样的东西。


当前回答

这是这个问题的一般解决办法。

public static <K extends Object, V extends Object> Map<K, V> getJsonAsMap(String json, K key, V value) {
    try {
      ObjectMapper mapper = new ObjectMapper();
      TypeReference<Map<K, V>> typeRef = new TypeReference<Map<K, V>>() {
      };
      return mapper.readValue(json, typeRef);
    } catch (Exception e) {
      throw new RuntimeException("Couldnt parse json:" + json, e);
    }
  }

希望有一天有人会想到创建一个util方法来转换为Map的任何键/值类型,因此这个答案:)

其他回答

[更新2020年9月]虽然我多年前在这里的原始答案似乎很有帮助,而且仍然得到了点赞,但我现在使用谷歌的GSON库,我发现它更直观。

我有以下代码:

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,你可以通过以下方法从字符串中获得一个InputStream:

new ByteArrayInputStream(astring.getBytes("UTF-8")); 

在我的博客上有更多关于绘图仪的解释。

你得到的警告是由编译器完成的,而不是由库(或实用程序方法)。

直接使用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\"}");

注意,读取器实例是线程安全的。

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"
}