219

我正在尝试做这样的事情,但它不起作用:

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

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

但是 IDE 说:

未经检查的分配Map to Map<String,String>

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

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

4

10 回答 10

362

[2020 年 9 月更新] 尽管我多年前的原始答案似乎很有帮助并且仍在获得支持,但我现在使用 Google 的 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()也将接受 an并且您可以使用以下命令从字符串InputStream中获取 an :InputStream

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

在我的博客上有更多关于映射器的解释。

于 2010-03-26T17:04:41.980 回答
61

试试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));
于 2010-06-19T17:42:23.180 回答
29

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

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

您调用的实用程序方法可能只是做类似的事情。

于 2010-03-26T18:24:48.120 回答
19
ObjectReader reader = new ObjectMapper().readerFor(Map.class);

Map<String, String> map = reader.readValue("{\"foo\":\"val\"}");

请注意,reader实例是线程安全的。

于 2014-10-15T09:58:33.343 回答
10

从字符串转换为 JSON 映射:

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

ObjectMapper mapper = new ObjectMapper();

map = mapper.readValue(string, HashMap.class);
于 2012-06-28T08:16:58.153 回答
5
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);

我认为这将解决您的问题。

于 2015-12-10T06:04:34.690 回答
4

以下对我有用:

Map<String, String> propertyMap = getJsonAsMap(json);

wheregetJsonAsMap定义如下:

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 中有子对象(因为它们不是 a ,它们是 another ),这失败,但如果您的 json 是如下属性的键值列表,则它将起作用:StringHashMap

{
    "client_id": "my super id",
    "exp": 1481918304,
    "iat": "1450382274",
    "url": "http://www.example.com"
}
于 2015-12-21T20:09:31.253 回答
4

只是想给出一个 Kotlin 的答案

val propertyMap = objectMapper.readValue<Map<String,String>>(properties, object : TypeReference<Map<String, String>>() {})
于 2019-10-30T18:27:40.823 回答
2

使用谷歌的 Gson

为什么不使用此处提到的 Google 的 Gson ?

非常直截了当,为我完成了这项工作:

HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
于 2016-10-28T10:18:27.090 回答
1

这是此问题的通用解决方案。

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);
    }
  }

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

于 2018-05-04T11:09:17.550 回答