如何反序列化来自 IEX 云批处理端点的 JSON 数据
How to deserialize JSON data from an IEX Cloud batch endpoint
我正在从 IEX 云批处理端点请求数据。该请求包含一个包含多个交易品种和 returns 相关市场数据的查询字符串。为了使问题更简单,我在下面仅显示了一部分响应。我还使用 https://www.jsonschema2pojo.org/ 自动构建我的 POJO 并将其显示在请求下方。我的请求在示例中包含一批 AAPL 和 FB 的符号,但在生产中它可以包含任意数量的用户选择的符号。鉴于响应的结构,我如何创建通用符号 POJO?正如您在下面看到的,JSONSchema 为每个符号创建了一个 POJO(例如 Aapl POJO 和 FB POJO),但我并不总是知道请求的是什么符号或其中有多少。
来自批量符号请求的 IEX 云响应。
{
"AAPL": {
"quote": {
"symbol": "AAPL",
"latestPrice": 133.985
}
},
"FB": {
"quote": {
"symbol": "FB",
"latestPrice": 339.13
}
}
}
POJO 由 JSONSchema.org 构建。
-----------------------------------com.example.Aapl.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"quote"
})
@Generated("jsonschema2pojo")
public class Aapl {
@JsonProperty("quote")
public Quote quote;
}
-----------------------------------com.example.Fb.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"quote"
})
@Generated("jsonschema2pojo")
public class Fb {
@JsonProperty("quote")
public Quote__1 quote;
}
-----------------------------------com.example.Quote.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"symbol",
"latestPrice"
})
@Generated("jsonschema2pojo")
public class Quote {
@JsonProperty("symbol")
public String symbol;
@JsonProperty("latestPrice")
public Double latestPrice;
}
-----------------------------------com.example.Quote__1.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"symbol",
"latestPrice"
})
@Generated("jsonschema2pojo")
public class Quote__1 {
@JsonProperty("symbol")
public String symbol;
@JsonProperty("latestPrice")
public Double latestPrice;
}
-----------------------------------com.example.Security.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"AAPL",
"FB"
})
@Generated("jsonschema2pojo")
public class Security {
@JsonProperty("AAPL")
public Aapl aapl;
@JsonProperty("FB")
public Fb fb;
}
"AAPL"
和 "FB"
是 dynamic 字段名,所以不能使用 fixed-name class 的字段来映射它们,但应该使用根对象中的 Map<String, ...>
字段。
"AAPL"
和 "FB"
的值是相同的结构,即具有名为 quote
的字段的对象,因此您需要一个 class 与之匹配。
quote
的值是一个包含两个字段 symbol
和 latestPrice
的对象,因此您需要一个 class 匹配它。
class Root {
private Map<String, Stock> stocks = new LinkedHashMap<>();
@JsonAnyGetter
public Map<String, Stock> getStocks() {
return this.stocks;
}
@JsonAnySetter
public void addStock(String name, Stock value) {
this.stocks.put(name, value);
}
}
class Stock {
private Quote quote;
public Quote getQuote() {
return this.quote;
}
public void setQuote(Quote quote) {
this.quote = quote;
}
}
class Quote {
private String symbol;
private BigDecimal latestPrice;
public String getSymbol() {
return this.symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public BigDecimal getLatestPrice() {
return this.latestPrice;
}
public void setLatestPrice(BigDecimal latestPrice) {
this.latestPrice = latestPrice;
}
}
我正在从 IEX 云批处理端点请求数据。该请求包含一个包含多个交易品种和 returns 相关市场数据的查询字符串。为了使问题更简单,我在下面仅显示了一部分响应。我还使用 https://www.jsonschema2pojo.org/ 自动构建我的 POJO 并将其显示在请求下方。我的请求在示例中包含一批 AAPL 和 FB 的符号,但在生产中它可以包含任意数量的用户选择的符号。鉴于响应的结构,我如何创建通用符号 POJO?正如您在下面看到的,JSONSchema 为每个符号创建了一个 POJO(例如 Aapl POJO 和 FB POJO),但我并不总是知道请求的是什么符号或其中有多少。
来自批量符号请求的 IEX 云响应。
{
"AAPL": {
"quote": {
"symbol": "AAPL",
"latestPrice": 133.985
}
},
"FB": {
"quote": {
"symbol": "FB",
"latestPrice": 339.13
}
}
}
POJO 由 JSONSchema.org 构建。
-----------------------------------com.example.Aapl.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"quote"
})
@Generated("jsonschema2pojo")
public class Aapl {
@JsonProperty("quote")
public Quote quote;
}
-----------------------------------com.example.Fb.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"quote"
})
@Generated("jsonschema2pojo")
public class Fb {
@JsonProperty("quote")
public Quote__1 quote;
}
-----------------------------------com.example.Quote.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"symbol",
"latestPrice"
})
@Generated("jsonschema2pojo")
public class Quote {
@JsonProperty("symbol")
public String symbol;
@JsonProperty("latestPrice")
public Double latestPrice;
}
-----------------------------------com.example.Quote__1.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"symbol",
"latestPrice"
})
@Generated("jsonschema2pojo")
public class Quote__1 {
@JsonProperty("symbol")
public String symbol;
@JsonProperty("latestPrice")
public Double latestPrice;
}
-----------------------------------com.example.Security.java-----------------------------------
package com.example;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"AAPL",
"FB"
})
@Generated("jsonschema2pojo")
public class Security {
@JsonProperty("AAPL")
public Aapl aapl;
@JsonProperty("FB")
public Fb fb;
}
"AAPL"
和 "FB"
是 dynamic 字段名,所以不能使用 fixed-name class 的字段来映射它们,但应该使用根对象中的 Map<String, ...>
字段。
"AAPL"
和 "FB"
的值是相同的结构,即具有名为 quote
的字段的对象,因此您需要一个 class 与之匹配。
quote
的值是一个包含两个字段 symbol
和 latestPrice
的对象,因此您需要一个 class 匹配它。
class Root {
private Map<String, Stock> stocks = new LinkedHashMap<>();
@JsonAnyGetter
public Map<String, Stock> getStocks() {
return this.stocks;
}
@JsonAnySetter
public void addStock(String name, Stock value) {
this.stocks.put(name, value);
}
}
class Stock {
private Quote quote;
public Quote getQuote() {
return this.quote;
}
public void setQuote(Quote quote) {
this.quote = quote;
}
}
class Quote {
private String symbol;
private BigDecimal latestPrice;
public String getSymbol() {
return this.symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public BigDecimal getLatestPrice() {
return this.latestPrice;
}
public void setLatestPrice(BigDecimal latestPrice) {
this.latestPrice = latestPrice;
}
}