将json转换为Value对

时间:2014-08-21 09:29:20

标签: java json map jackson

我有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

1 个答案:

答案 0 :(得分:0)

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

((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);