gpt4 book ai didi

java - 使用 Jackson 将 json 数组反序列化为 java 对象

转载 作者:行者123 更新时间:2023-11-29 08:06:19 24 4
gpt4 key购买 nike

给定以下 json:

{ "response": {
"totalProcessingTime": "271.0",
"resultSets": {
"products": {
"firstHit": "1",
"lastHit": "10",
"totalHits": "77",
"hits": [
{
"number": "1",
"dmsubcategory": "TV, lyd og bilde",
"collection": "tilbud",
"title": "<b>TV</b> Panasonic 47 TX-LU 7ET5Y"
},
{
"number": "2",
"dmsubcategory": "TV, lyd og bilde",
"collection": "tilbud",
"title": "<b>TV</b> Panasonic 47 TX-LU 7ET5Y"
},
{
"number": "3",
"dmsubcategory": "TV, lyd og bilde",
"collection": "tilbud",
"title": "<b>TV</b> Panasonic 47 TX-LU 7ET5Y"
}
]
}
}
}
}

我正在使用以下代码调用 jackson:

ObjectMapper mapper = new ObjectMapper();
SearchResult searchResult = mapper.readValue(new URL(jsonUrl + queryUrl), SearchResult.class);

我已经为产品类的整个层次结构生成了 POJO:

public class Products {

public List<Hits> hits;
public String totalHits;

@JsonAnySetter
public void handleUnknown(String key, Object value) {
// do something: put to a Map; log a warning, whatever
}

public List<Hits> getHits() {
return hits;
}

public void setHits(List<Hits> hits) {
this.hits = hits;
}

public String getTotalHits() {
return totalHits;
}

public void setTotalHits(String totalHits) {
this.totalHits = totalHits;
}

}

和点击类:

public class Hits {

public String number;
public String title;

public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}

@JsonAnySetter
public void handleUnknown(String key, Object value) {
// do something: put to a Map; log a warning, whatever
}

}

所有其他属性都映射正确,但包含命中的列表不正确。一切都是空的。我怎样才能映射它以使其正确?

谢谢!

最佳答案

您的模型不兼容。

为了查看出了什么问题,使用一些 toString 可能是个好主意,您可以轻松查看映射失败的位置。

您有一个需要保存属性响应的对象,需要保存属性结果集,需要保存需要保存命中的属性产品。

我是这样实现的:

GeneralResponse
- Response
- ResultSets
- Products
- Hits
- number
- title

请测试以下实现:

package snippet;

public class GeneralResponse {

private Response response;

public Response getResponse() {
return response;
}

public void setResponse(Response response) {
this.response = response;
}

@Override
public String toString() {
return "GeneralResponse [response=" + response + "]";
}

}


package snippet;

public class ResultSets {

private Products products;

public Products getProducts() {
return products;
}

public void setProducts(Products products) {
this.products = products;
}

@Override
public String toString() {
return "ResultSets [products=" + products + "]";
}

}

package snippet;

import java.util.List;

import org.codehaus.jackson.annotate.JsonAnySetter;

public class Products {

public List<Hits> hits;
public String totalHits;

@JsonAnySetter
public void handleUnknown(String key, Object value) {
// do something: put to a Map; log a warning, whatever
}

public List<Hits> getHits() {
return hits;
}

public void setHits(List<Hits> hits) {
this.hits = hits;
}

public String getTotalHits() {
return totalHits;
}

public void setTotalHits(String totalHits) {
this.totalHits = totalHits;
}

@Override
public String toString() {
return "Products [hits=" + hits + ", totalHits=" + totalHits + "]";
}

}


package snippet;

import org.codehaus.jackson.annotate.JsonAnySetter;

public class Response {

private ResultSets resultSets;

public ResultSets getResultSets() {
return resultSets;
}

public void setResultSets(ResultSets resultSets) {
this.resultSets = resultSets;
}

@Override
public String toString() {
return "Response [resultSets=" + resultSets + "]";
}

@JsonAnySetter
public void handleUnknown(String key, Object value) {
// do something: put to a Map; log a warning, whatever
}

}



package snippet;

import org.codehaus.jackson.annotate.JsonAnySetter;

public class Hits {

public String number;
public String title;

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}

public String getTitle() {
return title;
}

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

@JsonAnySetter
public void handleUnknown(String key, Object value) {
// do something: put to a Map; log a warning, whatever
}

@Override
public String toString() {
return "Hits [number=" + number + ", title=" + title + "]";
}

}

毕竟你可以这样做:

    ObjectMapper om = new ObjectMapper();
Object r = om.readValue(inputStream, GeneralResponse.class);

关于java - 使用 Jackson 将 json 数组反序列化为 java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10975685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com