我正在使用Jackson和RESTEasy挂钩外部API。 API主要返回我已成功填充到POJO中的简单对象。
我遇到了一个问题,我得到一个对象数组,例如。
[
{
"variable1": "someValue1",
"variable2": "someValue2",
"variable3": "someValue3"
}
{
"variable1": "someValue4",
"variable2": "someValue5",
"variable3": "someValue6"
}
{
"variable1": "someValue7",
"variable2": "someValue8",
"variable3": "someValue9"
}
]
我有两个类:一个名为VariableObject,如下所示:
public class VariableObject {
private String variable1;
private String variable2;
private String variable3;
}
和VariableResponse看起来像:
public class VariableResponse {
private List<VariableObject> variableObjects;
}
我的客户端使用JAXRS Response类将实体读入类中,即
return response.readEntity(VariableResponse.class);
我得到一个堆栈跟踪,内容如下:
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of VariableResponse out of START_ARRAY token
据我所知,您可以将这些作为POJO列表返回,即很容易列出,但这不是我想要做的。
问题实际上是两部分: 一个。我可以使用Jackson(一些如何)填充VariableResponse POJO,最好没有客户反序列化器吗?也许存在一些注释(这是理想的)? 湾是否有某种方法可以检测数组是否作为响应中的根JSON节点重新调整,然后相应地采取行动?
非常感谢。
答案 0 :(得分:1)
你的JSON确实是一个对象数组。
您可以使用以下命令对其进行反序列化:
response.readEntity(new GenericType<List<VariableObject>>() {});
然后创建一个VariableResponse的新实例,将结果List作为构造函数参数传递,如下所示:
public class VariableResponse {
private final List<VariableObject> variableObjects;
public VariableResponse(List<VariableObject> variableObjects) {
this.variableObject = new ArrayList<>(variableObjects);
}
}
答案 1 :(得分:0)
您可能忘记在每个{..}
后添加逗号。在更正您的JSON字符串后,我使用ArrayList<VariableObject>
和TypeReference
将其转换为ObjectMapper
。
示例代码:
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
...
TypeReference<ArrayList<VariableObject>> typeRef = new TypeReference<ArrayList<VariableObject>>() {};
ObjectMapper mapper = new ObjectMapper();
try {
ArrayList<VariableObject> data = mapper.readValue(jsonString, typeRef);
for (VariableObject var: data) {
System.out.println(var.getVariable1()+","+var.getVariable2()+","+var.getVariable3());
}
} catch (Exception e) {
System.out.println("There might be some issue with the JSON string");
}
输出:
someValue1,someValue2,someValue3
someValue4,someValue5,someValue6
someValue7,someValue8,someValue9
答案 2 :(得分:0)
如果您希望直接使用自己的回复类型。
尝试仅扩展ArrayList吗?
public VariableResponse extends ArrayList<VariableObject> {
}