Java 如何将JSON字符串转换为映射<;字符串,字符串>;用Jackson JSON

Java 如何将JSON字符串转换为映射<;字符串,字符串>;用Jackson JSON,java,jackson,Java,Jackson,我正试图做类似的事情,但不起作用: Map<String, String> propertyMap = new HashMap<String, String>(); propertyMap = JacksonUtils.fromJSON(properties, Map.class); MapPropertyMap=newHashMap(); propertyMap=JacksonUtils.fromJSON(properties,Map.class); 但是IDE说

我正试图做类似的事情,但不起作用:

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

propertyMap = JacksonUtils.fromJSON(properties, Map.class);
MapPropertyMap=newHashMap();
propertyMap=JacksonUtils.fromJSON(properties,Map.class);
但是IDE说:

未选中的分配
映射到映射

正确的方法是什么? 我之所以使用Jackson,是因为这是项目中已有的功能,是否有一种本地Java方式可以转换为JSON或从JSON转换为JSON

在PHP中,我只需
json\u解码($str)
就可以得到一个数组。我在这里需要基本相同的东西。

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

关于上的映射器还有更多的解释。

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

直接使用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);
HashMap道具;
//src是一个文件、InputStream、字符串等
props=newObjectMapper().readValue(src,newTypeReference(){});
//或:
props=(HashMap)newObjectMapper().readValue(src,HashMap.class);
//甚至只是:
@SuppressWarnings(“unchecked”)//抑制类型/取消类型不匹配警告,这是无害的
props=newObjectMapper().readValue(src,HashMap.class);

您调用的实用程序方法可能只是执行类似的操作。

尝试
TypeFactory
。以下是Jackson JSON(2.8.4)的代码

Map结果;
对象映射器映射器;
打字机厂;
地图类型;
factory=TypeFactory.defaultInstance();
type=factory.constructMapType(HashMap.class、String.class、String.class);
映射器=新的ObjectMapper();
结果=mapper.readValue(数据,类型);
以下是旧版本Jackson JSON的代码

Map<String, String> result = new ObjectMapper().readValue(
    data, TypeFactory.mapType(HashMap.class, String.class, String.class));
Map result=new ObjectMapper().readValue(
数据,TypeFactory.mapType(HashMap.class,String.class,String.class));

从字符串转换为JSON映射:

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

ObjectMapper mapper = new ObjectMapper();

map = mapper.readValue(string, HashMap.class);
Map Map=newhashmap();
ObjectMapper mapper=新的ObjectMapper();
map=mapper.readValue(字符串,HashMap.class);
ObjectReader reader=newObjectMapper().reader(Map.class);
Map Map=reader.readValue(“{\'foo\':\'val\'}”);
请注意,
reader
实例是线程安全的。

JavaType JavaType=objectMapper.getTypeFactory().ConstructedParameterizedType(Map.class、Key.class、Value.class);
JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);
Map Map=objectMapper.readValue(jsonStr,javaType);

我想这会解决你的问题。

以下几点对我有用:

Map<String, String> propertyMap = getJsonAsMap(json);
请注意,如果您的json中有子对象(因为它们不是
字符串,而是另一个
HashMap
),则此操作将失败,但如果您的json是如下属性的键值列表,则此操作将有效:

{
    "client_id": "my super id",
    "exp": 1481918304,
    "iat": "1450382274",
    "url": "http://www.example.com"
}
使用谷歌的Gson 为什么不使用中提到的谷歌的Gson

非常直截了当地为我做了这项工作:

HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
HashMap map=new Gson().fromJson(yourJsonString,new TypeToken(){}.getType());

以下是此问题的通用解决方案

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);
    }
  }
publicstaticmap getJsonAsMap(字符串json,K键,V值){
试一试{
ObjectMapper mapper=新的ObjectMapper();
TypeReference typeRef=新的TypeReference(){
};
返回mapper.readValue(json,typeRef);
}捕获(例外e){
抛出新的RuntimeException(“无法解析json:+json,e);
}
}

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

只是想给出一个Kotlin的答案

val propertyMap = objectMapper.readValue<Map<String,String>>(properties, object : TypeReference<Map<String, String>>() {})
val propertyMap=objectMapper.readValue(属性,对象:TypeReference(){})

JacksonUtils类从何而来?我在Jackson的任何版本中都没有看到它。它是我们为Jackson设计的包装器,负责处理一些JsonFactory和ObjectMapper的工作。所以,问题是JacksonUtils.fromJSON()并没有声明为返回Map,只是Map。顺便说一句,不要在第一行指定新的HashMap:这会被忽略。只是协助通话。标题与您描述的问题无关,而与非类型化集合有关。下面的答案是您真正想问的问题的正确答案。TypeFactory.mapType(…)现在已被弃用,请尝试以下方法:新的TypeReference(){}@cyber monk,它消除了警告,但实际上并没有检查类型。以上仍然导致
类型安全:类型HashMap的表达式需要未经检查的转换才能符合Map
。虽然这可以通过
@SuppressWarnings
注释来抑制,但我建议首先使用
TypeReference
,或者像StaxmanTo提到的那样使用casting来消除类型安全警告,您可以使用
map=mapper.readValue(string,map.getClass())-假设您已经实例化了映射,这里就是这样。如果var的类型是map,只获取对象类是不对的。@Suraj,这是根据文档,我同意我无法从第一原理推断公式。克里格:我原以为最难的是让映射程序运行起来,但我已经添加了关于如何将该技术应用于stringOne的注释:不需要创建
JsonFactory
的第一行
ObjectMapper
可以自动创建它。@djna海报要求
Map
,您已经提供了
Map
。要将地图作为字符串编写,您可以使用
mapper.writeValueAsString(hashmap)
在java文档中:从2.5开始,但可能会在2.7或2.8中被弃用(2.7不需要)OP要求
Map
而你提供了
Map
@dpetruha OP要求
Map
而你提供了
Map
。大家都同意,世界已经向前发展了,Gson使用起来要容易得多。嗯,不是s
{
    "client_id": "my super id",
    "exp": 1481918304,
    "iat": "1450382274",
    "url": "http://www.example.com"
}
HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
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);
    }
  }
val propertyMap = objectMapper.readValue<Map<String,String>>(properties, object : TypeReference<Map<String, String>>() {})