使用jackson中的响应从指定键反序列化为类

时间:2017-10-27 06:46:59

标签: java json spring jackson

我从外部api得到回应

"success": true,
    "data": [
        {}

我想只将数据和它的相应数组映射为整个类。 现在我有它的包装,但它只是+1级。

public class YYYYYY {

    private boolean success;
    @JsonProperty(value = "data")
    private List<PipeDriveContact> arrayData;

4 个答案:

答案 0 :(得分:0)

您可以使用@JsonCreator来定义构造函数并仅填充数据

或者您也可以使用自定义反序列化器。

进一步阅读和示例:

  1. http://www.baeldung.com/jackson-annotations
  2. http://buraktas.com/convert-objects-to-from-json-by-jackson-example/
  3. https://codexplo.wordpress.com/2015/11/26/custom-json-deserialization-with-jackson/

答案 1 :(得分:0)

也许这不完全符合您的要求,但您只能使用@JsonIgnoreProperties(ignoreUnknown = true)映射课程中所需的字段:

@JsonIgnoreProperties(ignoreUnknown = true)
public class YYYYYY {

@JsonProperty(value = "data")
private List<PipeDriveContact> arrayData;

答案 2 :(得分:0)

如果绝对不需要最外层对象中的其他键,则可以根据键“data”解析数组,然后将其单独解析到POJO中。以下是我粗略的实施:

首先,解析出数据数组:

String json = "{\"success\": true,\"data\": [{\"test\": \"some data\"}]}";

JSONObject obj = new JSONObject(json);
String data = obj.getJSONArray("data").toString();

然后,使用Jackson(或其他任何东西),使用您所需的对象创建一个ArrayList:

ObjectMapper objectMapper = new ObjectMapper();
TypeReference<ArrayList<PipeDriveContact>> typeRef = new TypeReference<ArrayList<PipeDriveContact>>() {};
ArrayList<PipeDriveContact> dataArray = objectMapper.readValue(data, typeRef);

以下是我为测试而创建的模型POJO:

public class PipeDriveContact {
    private String test;

    public String getTest() { return test; }

    public void setTest(String test) { this.test = test; }
}

以下是我使用的依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.6.3</version>
</dependency>
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20171018</version>
</dependency>

希望这有帮助。

答案 3 :(得分:0)

这类似于https://stackoverflow.com/a/19097149/6785908

首先需要获取数组

String jsonStr = "{\"success\": true,\"data\": [{\"test\": \"some data\"}]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonStr);
ArrayNode arrayNode = (ArrayNode) node.get("data");
System.out.println(arrayNode);
List<PipeDriveContact> pojos = mapper.readValue(arrayNode.toString(), new TypeReference<List<PipeDriveContact>>() {});

System.out.println(pojos);

打印(使用toString()

[{\"test\": \"some data\"}] // the json array 

但请相信我,除非你有一个非常令人信服的理由(而不是“我不想再增加一个课程”),否则我会阻止你走这条路,而是用包装类实现它并调用它。 原因:将来你可以根据合同生成Pojos(swagger spec / ol JSON模式),或者你可以找到一些用于“成功”字段。