【问题标题】:convert json into Value pairs将 json 转换为值对
【发布时间】:2014-08-21 09:29:19
【问题描述】:

我有如下的Json(json的整个格式每次都可以变化)字符串,

{"domain": {
  "id": "file",
  "value": "Content",
  "popup": {
    "menuitem1": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]   
  }
}}

我已将其转换为地图,其键和值如下,

Map<String, Object> jsonMap = new HashMap<String, Object>();        
ObjectMapper mapper = new ObjectMapper();
jsonMap = mapper.readValue(jsonString,new TypeReference<HashMap<String,Object>>(){});

KEY :domain 
VALUE :{id=file, popup={menuitem=[{value=New, onclick=CreateNewDoc()}, {value=Open, onclick=OpenDoc()}, {value=Close, onclick=CloseDoc()}],}, value=Content}

如何通过将其名称传递给地图来访问每个值,例如

map.get(id) = file
map.get(popup) = {menuitem=[{value=New, onclick=CreateNewDoc()}, {value=Open, onclick=OpenDoc()}, {value=Close, onclick=CloseDoc()}]}
map.get(value) = Content

【问题讨论】:

  • 你试过了吗?你得到了什么结果?
  • 我目前正在尝试拆分我之前转换的地图..

标签: java json map jackson


【解决方案1】:

如果你想从地图中获取内部字段,你需要使用一种非常不舒服的语法,如下所示:

((Map<String, Object>)jsonMap.get("domain")).get("id") // returns "file"

我认为您可以在可以手动创建的便捷类中读取 json。 该类将包含 json 中包含的所有字段,您将可以使用 get 方法访问它们。

class DomainClass {
     public InnerDomain domain;
}

class MenuItem {
     public String value;
     public String onclick;
}

class PopupClass {
    public List<MenuItem> menuitem1;

}

class InnerDomain {
     public String id;
     public String value;
     public PopupClass popup;
}

DomainClass 类是您需要用来反序列化 json 的主要类。使用 jackson 非常简单,看起来就像您在案例中使用的方法:

ObjectMapper mapper = new ObjectMapper();
DomainClass domainObj = mapper.readValue(jsonString, DomainClass.class);
// print the id field
System.out.println(domainObj.domain.id); 

【讨论】:

  • 谢谢。但是Json的格式可能每次都不同,所以无法维护一个POJO
  • 你确定吗?哪个领域可以改变?
  • 它可能来自不同的域,因此整个 JSon 可能会有所不同
  • 也许你可以找到一个保持不变的特定结构,这将允许你定义一个基类。之后,您可以使用继承为每个域生成特定的 POJO 类。对你有好处吗?
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 2019-05-24
  • 2013-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 2018-02-20
相关资源
最近更新 更多