Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从jackson中的响应反序列化到具有指定键的类_Java_Json_Spring_Jackson - Fatal编程技术网

Java 从jackson中的响应反序列化到具有指定键的类

Java 从jackson中的响应反序列化到具有指定键的类,java,json,spring,jackson,Java,Json,Spring,Jackson,我收到来自外部api的响应 "success": true, "data": [ {} 我只想将数据及其对应的数组映射为整个类。 现在我有了它的包装器,但它就是+1类 public class YYYYYY { private boolean success; @JsonProperty(value = "data") private List<PipeDriveContact> arrayData; 公共类yyyyy{ 私人布尔

我收到来自外部api的响应

"success": true,
    "data": [
        {}
我只想将数据及其对应的数组映射为整个类。 现在我有了它的包装器,但它就是+1类

public class YYYYYY {

    private boolean success;
    @JsonProperty(value = "data")
    private List<PipeDriveContact> arrayData;
公共类yyyyy{
私人布尔成功;
@JsonProperty(value=“data”)
私有列表数组数据;

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

或者也可以使用自定义反序列化程序

进一步阅读和举例:


  • 也许这并不完全是您想要的,但是您可以使用
    @JsonIgnoreProperties(ignoreUnknown=true)
    只映射类中所需的字段:

    @JsonIgnoreProperties(ignoreUnknown = true)
    public class YYYYYY {
    
    @JsonProperty(value = "data")
    private List<PipeDriveContact> arrayData;
    
    @JsonIgnoreProperties(ignoreUnknown=true)
    公共类yyyyy{
    @JsonProperty(value=“data”)
    私有列表数组数据;
    
    如果您绝对不需要最外层对象中的其他键,您可以根据键“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);
    
    以下是我使用的依赖项:

    <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>
    
    
    com.fasterxml.jackson.core
    杰克逊数据绑定
    2.6.3
    org.json
    json
    20171018
    
    希望这有帮助。

    这与

    您首先需要获取阵列

    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);
    
    但是请相信我,除非您有一个非常令人信服的理由(而不是“我不想再有一个类”),否则我会劝阻您不要沿着这条路走下去,而是用包装器类实现它并称之为“完成”。
    原因:将来您可能会从契约(swagger spec/ol JSON模式)生成POJO,或者您可能会发现“成功”字段有一些用处。

    在web.xml`中创建一个过滤器,从请求中删除所有不需要的属性,并将剩余的属性放回请求和控制器中,您可以将其作为
    @RequestBody yyyy wrapperObj
    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);
    
    [{\"test\": \"some data\"}] // the json array