如何使用Jackson JSON将JSON字符串转换为Map <String,String>

ada*_*Lev 174 java jackson

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

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

propertyMap = JacksonUtils.fromJSON(properties, Map.class);
Run Code Online (Sandbox Code Playgroud)

但IDE说:

未选中的作业 Map to Map<String,String>

这样做的正确方法是什么?我只使用Jackson,因为这是项目中已有的,是否有一种原生Java方式转换为JSON /从JSON转换?

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

djn*_*jna 288

我有以下代码:

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); 
}   
Run Code Online (Sandbox Code Playgroud)

它正在读取文件,但mapper.readValue()也会接受InputStream,您可以InputStream使用以下命令从字符串中获取:

new ByteArrayInputStream(astring.getBytes("UTF-8")); 
Run Code Online (Sandbox Code Playgroud)

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

  • 它有效,但看起来有点奇怪吗? (2认同)
  • @Suraj,这是根据文件,我同意我不能从第一原则推断出这个表述.表明Java比我们想象的更复杂并不是那么奇怪. (2认同)
  • 一个小评论:不需要创建`JsonFactory`的第一行.`ObjectMapper`可以自动创建它. (2认同)
  • @djna 发帖者要求提供“Map&lt;String, String&gt;”,而您已提供“Map&lt;String, Object&gt;”。 (2认同)

Nin*_*Sun 52

试试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);
Run Code Online (Sandbox Code Playgroud)

这是旧版Jackson JSON的代码.

Map<String, String> result = new ObjectMapper().readValue(
    data, TypeFactory.mapType(HashMap.class, String.class, String.class));
Run Code Online (Sandbox Code Playgroud)

  • 现在不推荐使用TypeFactory.mapType(...),请尝试以下方法:new TypeReference <HashMap <String,String >>(){} (38认同)
  • @ cyber-monk摆脱了警告,但实际上没有检查类型. (2认同)

Sta*_*Man 25

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

直接使用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);
Run Code Online (Sandbox Code Playgroud)

你调用的实用方法可能只是做了类似的事情.

  • OP 要求提供`Map&lt;String, String&gt;`,而您提供了`Map&lt;String, Object&gt;`。 (2认同)

dpe*_*uha 18

ObjectReader reader = new ObjectMapper().readerFor(Map.class);

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

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


小智 9

从String转换为JSON映射:

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

ObjectMapper mapper = new ObjectMapper();

map = mapper.readValue(string, HashMap.class);
Run Code Online (Sandbox Code Playgroud)

  • 上面的结果仍然是`类型安全:HashMap类型的表达式需要未经检查的转换以符合Map <String,String>`.虽然这可以通过`@ SuppressWarnings`注释来抑制,但我建议首先使用`TypeReference`或者按照Staxman的说法使用下一个 (4认同)

小智 9

只是想给出一个 Kotlin 答案

val propertyMap = objectMapper.readValue<Map<String,String>>(properties, object : TypeReference<Map<String, String>>() {})
Run Code Online (Sandbox Code Playgroud)


Bra*_*rks 6

以下对我有用:

Map<String, String> propertyMap = getJsonAsMap(json);
Run Code Online (Sandbox Code Playgroud)

其中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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的 json 中有子对象(因为它们不是 a ,而是 another ),则此操作将会失败,但如果您的 json 是属性的键值列表,则此操作将起作用,如下所示:StringHashMap

{
    "client_id": "my super id",
    "exp": 1481918304,
    "iat": "1450382274",
    "url": "http://www.example.com"
}
Run Code Online (Sandbox Code Playgroud)


Jac*_*Zhi 5

JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);
Run Code Online (Sandbox Code Playgroud)

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