2012-12-13 34 views
2

我从Solr的实例回来相当JSON响应Java对象....如何反序列化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 **/ 
    } 

如何将地址1,地址2,城市,州等等映射到项目对象中的地址对象?我一直在阅读关于Jackson annotations,但没有真正跳到我从哪里开始。

+0

你必须指定你所尝试的。有不同的方法http://mattgemmell.com/2008/12/08/what-have-you-tried/ –

+0

你有没有考虑过使用SolrJ?您可能会发现更方便,无论是解开响应还是构建查询。 –

+0

@Eric我没有,但完全愿意看看它。你有没有一个你认为是开始的好地方? – kasdega

回答

2

我们结束了使用Solrj - 那种。

我们写我们的,我们送入SolrJ像这样自己SolrResult对象:

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

然后在SolrResult.java在那里我们有我们只是第一次使用SolrJ注释获取字段复杂或嵌套对象,然后只需根据需要设置值...

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

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

2

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

下面是使用它的一个例子(从杰克逊的文档很大程度上解除):

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(); 
    } 
} 
+0

我会给它一个镜头谢谢! – kasdega