java - Jackson 将动态 json 转换为 map

标签 java json jackson

我遇到一个问题,json 的某些结构是固定的,而某些部分是动态的。最终输出必须是类型为

的对象
Map<String,List<Map<String,String>>>

我正在粘贴 Jackson 工作的示例 json 代码 -

    {
  "contentlets": [
    {
      "template": "8f8fab8e-0955-49e1-a2ed-ff45e3296aa8",
      "modDate": "2017-01-06 13:13:20.0",
      "cachettl": "0",
      "title": "New Early Warnings",
      "subscribeToListIi": "am@zz.com",
      "inode": "15bd497-1d8e-4bc7-b0f4-c799ed89fdc9",
      "privacySetting": "public",
      "__DOTNAME__": "New gTLD Early Warnings",
      "activityStatus": "Completed",
      "host": "10b6f94a-7671-4e08-9f4b-27bca80702e7",
      "languageId": 1,
      "createNotification": false,
      "folder": "951ff45c-e844-40d4-904f-92b0d2cd0c3c",
      "sortOrder": 0,
      "modUser": "dotcms.org.2897"
    }
  ]
}


ObjectMapper mapper = new  ObjectMapper();
Map<String,List<Map<String,String>>> myMap=mapper.readValue(responseStr.getBytes(), new TypeReference<HashMap<String,List<Map<String,String>>>>() {});

上面的代码工作正常,但是当 json 更改为(基本上添加了元数据标记)时,它无法转换为 map 。

{
  "contentlets": [
    {
      "template": "8f8fab8e-0955-49e1-a2ed-ff45e3296aa8",
      "modDate": "2017-01-06 13:13:20.0",
      "cachettl": "0",
      "title": "New gTLD Early Warnings",
      "subscribeToListIi": "aml@bb.com",
      "inode": "15bd4057-1d8e-4bc7-b0f4-c799ed89fdc9",
      "metadata": {
        "author": "jack",
        "location": "LA"
      },
      "privacySetting": "public",
      "__DOTNAME__": "New gTLD Early Warnings",
      "activityStatus": "Completed",
      "host": "10b6f94a-7671-4e08-9f4b-27bca80702e7",
      "languageId": 1,
      "createNotification": false,
      "folder": "951ff45c-e844-40d4-904f-92b0d2cd0c3c",
      "sortOrder": 0,
      "modUser": "dotcms.org.2897"
    }
  ]
}    

最佳答案

这是预期的,因为元数据值的类型不是String。如果您相应地更改 map 的类型,那么它就可以工作:

Map<String,List<Map<String,Object>>> myMap = mapper.readValue(reader, new TypeReference<HashMap<String,List<Map<String,Object>>>>() {});

当然,您会遇到映射中的值不是同一类型的问题。所以你需要问自己你想要的数据结构是什么以及如何进一步处理它。但是,无法将 json 结构反序列化为简单的 String

关于java - Jackson 将动态 json 转换为 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41679720/

相关文章:

java - 一对多映射中的@ElementCollection @CollectionTable

java - 比较两个 json 文件时忽略特定属性

java - java中的电子邮件验证

java - python 无法从网络打印解压的 float

c# - 我怎样才能将其重构为更易于管理的代码?

java - JHipster 实体在 JSON 中序列化时将用户属性设置为 null

java - 在这种情况下如何使用@JsonProperty - jackson API with lombok

java - 使用@JsonTypeInfo和@JsonSubTypes,反序列化没有基类和类型信息的具体子类的对象

java - 为什么在使用 sharedPreferences 时应该对字符串进行硬编码?

php - 通过 getJSON 将变量发送到数据库查询的最佳方法是什么?