【问题标题】:How to deserialize JSON into java objects using Jackson如何使用 Jackson 将 JSON 反序列化为 java 对象
【发布时间】:2012-12-20 15:14:52
【问题描述】:

我有一个从 solr 实例返回的 JSON 响应......

{"responseHeader":
  {"status":0,"QTime":1,"params":{"sort":"score asc","fl":"*,score",
    "q":"{! score=distance}","wt":"json","fq":"description:motor","rows":"1"}},
        "response":{"numFound":9,"start":0,"maxScore":6.8823843,"docs":
                  [{"workspaceId":2823,"state":"MN","address1":"1313 mockingbird Lane",
                    "address2":"","url":"http://mydomain.com/","city":"Minneapolis",
                    "country":"US","id":"399068","guid":"","geo":["45.540239, -98.580473"],
                    "last_modified":"2012-12-12T20:40:29Z","description":"ELEC MOTOR",
                    "postal_code":"55555","longitude":"-98.580473","latitude":"45.540239",
                    "identifier":"1021","_version_":1421216710751420417,"score":0.9288697}]}}

我正在尝试将其映射到 java 对象:

public class Item extends BaseModel implements Serializable {
    private static final long serialVersionUID = 1L;

    protected Integer workspaceId;
    protected String name;
    protected String description;
    protected String identifier;
    protected String identifierSort;
    protected Address address;
    protected String url;

        /** getters and setters eliminated for brevity **/
}

public class Address implements Serializable {
    private static final long serialVersionUID = 1L;

    protected String address1;
    protected String address2;
    protected String city;
    protected String state;
    protected String postalCode;
    protected String country;
            /** getters and setters eliminated for brevity **/
    }

如何将 address1、address2、city、state 等映射到 Item 对象中的 Address 对象中?我一直在阅读有关 Jackson annotations 的信息,但我没有真正想到从哪里开始。

【问题讨论】:

  • 您必须指定您尝试过的内容。有不同的方法mattgemmell.com/2008/12/08/what-have-you-tried
  • 您考虑过使用 SolrJ 吗?您可能会发现这对于展开响应和构造查询都更方便。
  • @Eric 我没有但完全愿意调查它。你有一个你认为是一个很好的起点吗?
  • @EricWilson SolrJ 确实有办法映射到 POJO,但没有(我能找到)映射到像我这样的嵌套子对象。

标签: java solr jackson


【解决方案1】:

如果使用 Jackson 1.9 或更高版本,您可以使用 @JsonUnwrapped 注释来处理此问题。

这是一个使用它的例子(大部分来自 Jackson 的文档):

public class Name {
   private String first, last;

   // Constructor, setters, getters
}

public class Parent {
   private int age;
   @JsonUnwrapped
   private Name name;

   // Constructor, setters, getters
}

public static void main(String[] args) {
   try {
      final ObjectMapper mapper = new ObjectMapper();
      final Parent parent = mapper.readValue(new File(
            "/path/to/json.txt"), Parent.class);
      System.out.println(parent);
   } catch (final Exception e) {
      e.printStackTrace();
   }
}

【讨论】:

    【解决方案2】:

    我们最终使用了 Solrj - 有点。

    我们编写了自己的 SolrResult 对象,并将其提供给 SolrJ,如下所示:

    List<SolrResult> solrResults = rsp.getBeans(SolrResult.class);
    

    然后在我们有复杂或嵌套对象的 SolrResult.java 中,我们首先使用 SolrJ 注释来获取字段,然后根据需要设置值...

    @Field("address1")
    public void setAddress1(String address1) {
        this.item.getAddress().setAddress1(address1);
    }
    

    这并不难,只是感觉有点乱,但确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      相关资源
      最近更新 更多