Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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/3/arrays/14.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 JSON-从嵌套数组中提取数据_Java_Arrays_Json_Jackson - Fatal编程技术网

Java Jackson JSON-从嵌套数组中提取数据

Java Jackson JSON-从嵌套数组中提取数据,java,arrays,json,jackson,Java,Arrays,Json,Jackson,注意:我已经重写了这个问题,事先问得太多了,我不知道如何解决这个问题 我目前正在尝试将RESTful API中的数据反序列化到POJO类中。API的每个方法都返回相同的响应结构,实际结果的结构因方法而异。我希望能够将每个方法的结果映射到它自己的POJO类 两个示例JSON响应属于这种结构,一个返回一个对象数组,另一个返回一系列属性 在这种情况下,“result”中的每个JSON对象都应该反序列化到它自己的POJO实例中 { "success" : true, "message" :

注意:我已经重写了这个问题,事先问得太多了,我不知道如何解决这个问题

我目前正在尝试将RESTful API中的数据反序列化到POJO类中。API的每个方法都返回相同的响应结构,实际结果的结构因方法而异。我希望能够将每个方法的结果映射到它自己的POJO类

两个示例JSON响应属于这种结构,一个返回一个对象数组,另一个返回一系列属性

在这种情况下,“result”中的每个JSON对象都应该反序列化到它自己的POJO实例中

{
   "success" : true,
   "message" : "",
   "result" : [{
            "Frequency" : 0.25000
            "Range" : 15.6
        }, {
            "Frequency" : 0.12500
            "Range" : 25.1
        }, {
            "Frequency" : 0.00750
            "Range" : 56.0
        }
    ]
}
在本例中,“result”是对象,应该映射到单个POJO实例

{
   "success" : true,
   "message" : "",
   "result" : {
       "Bid" : 2.05670368,
       "Ask" : 3.35579531,
       "Last" : 3.35579531
    }
}
这与前面的示例不同,因为它是来自不同API方法的响应。 我只是想提取结果,任何响应都不需要成功和消息。

由于您的结果响应是动态的,我建议您不要将结果对象包括在反序列化中。在执行反序列化的POJO类中包含以下代码

@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
示例用法

ObjectMapper objectMapper = new ObjectMapper();

// When the result is one object
Response<DistanceStat> res = objectMapper.readValue(data, new TypeReference<Response<DistanceStat>>() {});

// For a collection of objects under result
Response<Collection<DistanceStat>> res = objectMapper.readValue(data, new TypeReference<Response<Collection<DistanceStat>>>() {});
ObjectMapper objectMapper = new ObjectMapper();

// When the result is one object
Response<DistanceStat> res = objectMapper.readValue(data, new TypeReference<Response<DistanceStat>>() {});

// For a collection of objects under result
Response<Collection<DistanceStat>> res = objectMapper.readValue(data, new TypeReference<Response<Collection<DistanceStat>>>() {});
praintnode是您的父类

编辑2:

注意:这是非常具体的情况

这些是您将需要的POJO类,您必须反序列化到的父类

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"success",
"message"
})
public class Example {

@JsonProperty("success")
private Boolean success;
@JsonProperty("message")
private String message;

@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("success")
public Boolean getSuccess() {
return success;
}

@JsonProperty("success")
public void setSuccess(Boolean success) {
this.success = success;
}

@JsonProperty("message")
public String getMessage() {
return message;
}

@JsonProperty("message")
public void setMessage(String message) {
this.message = message;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
Result2.java:

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"Bid",
"Ask",
"Last"
})
public class Result2 {

@JsonProperty("Bid")
private Double bid;
@JsonProperty("Ask")
private Double ask;
@JsonProperty("Last")
private Double last;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("Bid")
public Double getBid() {
return bid;
}

@JsonProperty("Bid")
public void setBid(Double bid) {
this.bid = bid;
}

@JsonProperty("Ask")
public Double getAsk() {
return ask;
}

@JsonProperty("Ask")
public void setAsk(Double ask) {
this.ask = ask;
}

@JsonProperty("Last")
public Double getLast() {
return last;
}

@JsonProperty("Last")
public void setLast(Double last) {
this.last = last;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
这里是棘手的部分,现在您的映射包含结果响应,但我们不确定它是对象列表还是对象列表

现在,为了得到结果,我们将首先尝试确定它是否是一个集合,因为列表是一个集合,它将帮助我们识别

Object resultObject = example.getAdditionalProperties().getKey("results");

if ( resultObject instanceof Collection<?>){

List<Result1> results=resultObject;
}

else{

Result2 results=resultObject;

}
希望这能解决你的问题


如果您需要任何澄清,请告诉我

我设法解决了我的问题。我按照编码器的建议创建了一个泛型类型的ParentNode。这允许任何类型甚至集合都包含在结果中

响应类

public class Response<T> {

    private boolean success;
    private String message;
    private T result;

    public T getResult() {
        return result;
    }

    public String getMessage () {
       return message;
    }

    public boolean getSuccess() {
        return success;
    }
}
示例用法

ObjectMapper objectMapper = new ObjectMapper();

// When the result is one object
Response<DistanceStat> res = objectMapper.readValue(data, new TypeReference<Response<DistanceStat>>() {});

// For a collection of objects under result
Response<Collection<DistanceStat>> res = objectMapper.readValue(data, new TypeReference<Response<Collection<DistanceStat>>>() {});
ObjectMapper objectMapper = new ObjectMapper();

// When the result is one object
Response<DistanceStat> res = objectMapper.readValue(data, new TypeReference<Response<DistanceStat>>() {});

// For a collection of objects under result
Response<Collection<DistanceStat>> res = objectMapper.readValue(data, new TypeReference<Response<Collection<DistanceStat>>>() {});
这是我现在正在寻找的一个近乎优雅的解决方案,现在可以用来避免第二个使用示例中的三重类型定义


注意:我接受编码器的答案,因为它导致了这个解决方案。

对于到底要实现什么,我感到困惑?创建POJO类是您的选择吗?详细说明你的问题!我想用结果数组中包含的数据填充POJO实例。结果可以包含单个对象,也可以包含一组对象,因此默认对象映射器很难实现这一点。需要什么注释/方法才能做到这一点?@Coder我重新编写了这个问题,因为它太过复杂,无法做出准确的响应。我更新了我的响应@flemingjp,结果属性变量来自不同的api方法,而不是来自同一方法的不同请求。我在我的帖子中试图澄清这一点。我将为每个方法提供不同的POJO,但是所有的POJO都具有相同的响应结构,我想处理这些响应结构,所以您只需看看如何使用jackson进行反序列化?我正在尝试从Http获取yes.yesrequest@Flemingjp解决了这个问题?你也在找pojo课程吗?
public class Response<T> {

    private boolean success;
    private String message;
    private T result;

    public T getResult() {
        return result;
    }

    public String getMessage () {
       return message;
    }

    public boolean getSuccess() {
        return success;
    }
}
ObjectMapper objectMapper = new ObjectMapper();

// When the result is one object
Response<DistanceStat> res = objectMapper.readValue(data, new TypeReference<Response<DistanceStat>>() {});

// For a collection of objects under result
Response<Collection<DistanceStat>> res = objectMapper.readValue(data, new TypeReference<Response<Collection<DistanceStat>>>() {});