使用Jackson使用数组(根JSON节点)填充POJO

时间:2014-08-22 15:21:13

标签: java arrays json rest jackson

我正在使用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节点重新调整,然后相应地采取行动?

非常感谢。

3 个答案:

答案 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> {

}