如何使用ObjectMapper加载JSON以映射到特定的类结构?

时间:2013-11-20 20:06:55

标签: java json jackson

我可以使用Jackson ObjectMapper将JSON文件中的数据直接加载到我自己的数据结构中吗?我正在尝试从JSON文件加载对象的地图,但不知道该怎么做。

例如,给定:

public class View{
    public String name;
    public String title;
    public String link;
}

我想在JSON文件中创建/加载Views的地图。所以,如果我的JSON是:

 {
    "login" : {
      "name" : "login",
      "title" : "Login Page",
      "link" : "login.jsp"
    },
    "logout" : {
      "name" : "logout",
      "title" : "Logout Page",
      "link" : "logout.jsp"
    }
 }

我希望能够将所有内容加载到地图中。

我尝试了以下但没有成功。它只是将所有内容加载到地图中:

Map<String, View> views;
ObjectMapper mapper = new ObjectMapper();
views = mapper.readValue( viewFile.getInputStream(), Map.class );

我认为我的错误是告诉mapper将其作为Map.class读取,但不知道如何具体说明它。

2 个答案:

答案 0 :(得分:6)

这应该有效:

Map<String, View> views = mapper.readValue( viewFile.getInputStream(), new TypeReference<Map<String, View>>() {});

基本上通过使用TypeReference的匿名intance作为参数,泛型类型(View)不会被删除,并且Jackson将使用它来干净地生成Map<String, View>作为响应。 / p>

答案 1 :(得分:0)

一样定义你的班级
public class View{
  public View() {
  }

  public Info getLogin() {
    return login;
  }

  public void setLogin(Info login) {
    this.login = login;
  }

  public Info getLogout() {
    return logout;
  }

  public void setLogout(Info logout) {
    this.logout = logout;
  }

  private Info login;
  private Info logout;
}


class Info{
  public Info() {
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getLink() {
    return link;
  }

  public void setLink(String link) {
    this.link = link;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  private String name;
  private String link;
  private String title;
}

然后使用以下代码将json绑定到类

View v = new ObjectMapper().readValue(JSON_STRING, View.class);

这会将json绑定到View类的对象。