代码之家  ›  专栏  ›  技术社区  ›  adamJLev

如何使用jackson json将json字符串转换为map<string,string>

  •  154
  • adamJLev  · 技术社区  · 14 年前

    我正试着做这样的事,但没用:

    Map<String, String> propertyMap = new HashMap<String, String>();
    
    propertyMap = JacksonUtils.fromJSON(properties, Map.class);
    

    但是IDE说:

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

    正确的方法是什么? 我只使用杰克逊,因为这是项目中已经可用的,有没有原生Java方式转换到JSON?

    在php中,我只需要 json_decode($str) 我会得到一个阵列。我需要基本上相同的东西。

    9 回复  |  直到 6 年前
        1
  •  265
  •   Community c0D3l0g1c    8 年前

    我有以下代码:

    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 你可以得到一个 输入流 从字符串中使用以下命令:

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

    上面有关于映射器的更多解释 my blog .

        2
  •  49
  •   Nathan    7 年前

    尝试 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));
    
        3
  •  23
  •   djna    14 年前

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

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

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

        4
  •  17
  •   StaxMan    7 年前
    ObjectReader reader = new ObjectMapper().readerFor(Map.class);
    
    Map<String, String> map = reader.readValue("{\"foo\":\"val\"}");
    

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

        5
  •  10
  •   arrowd    12 年前

    从字符串转换为JSON映射:

    Map<String,String> map = new HashMap<String,String>();
    
    ObjectMapper mapper = new ObjectMapper();
    
    map = mapper.readValue(string, HashMap.class);
    
        6
  •  5
  •   JackieZhi    9 年前
    JavaType javaType = objectMapper.getTypeFactory().constructParameterizedType(Map.class, Key.class, Value.class);
    Map<Key, Value> map=objectMapper.readValue(jsonStr, javaType);
    

    我想这能解决你的问题。

        7
  •  3
  •   Brad Parks    9 年前

    以下对我有效:

    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"
    }
    
        8
  •  2
  •   Loukan ElKadi    7 年前

    使用google的gson

    为什么不使用google的gson呢? here ?

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

    HashMap<String,String> map = new Gson().fromJson( yourJsonString, new TypeToken<HashMap<String, String>>(){}.getType());
    
        9
  •  1
  •   NameNotFoundException    6 年前

    这是这个问题的一般解决方案。

    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方法来转换为任何键/值类型的映射,因此这个答案:)