【发布时间】:2018-04-06 22:47:28
【问题描述】:
一直以来,我都在使用 retrofit 和 JSON to POJO tool,以便让 Android 应用程序与 API 服务器通信。
API 服务器使用 JSON 作为响应。
最近遇到股票相关的回复,是这样的
{
"APPL": {
"quote": {
"symbol": "AAPL",
"lastPrice": 1.23
},
"stats": {
"dividendRate":2.52
}
},
"GOOGL": {
"quote": {
"symbol": "GOOGL",
"lastPrice": 4.56
},
"stats": {
"dividendRate":7.89
}
}
}
APPL 和 GOOGL 是公司股票代码。我将它们视为value。因此,我不希望它们被放置在 JSON 的名称字段(左侧)
我几乎无法为上述响应生成一组合适的类。
如果我将 JSON 输出直接插入 http://www.jsonschema2pojo.org/ ,我得到的结果是
public class BatchResponse {
@SerializedName("APPL")
@Expose
private APPL aPPL;
@SerializedName("GOOGL")
@Expose
private GOOGL gOOGL;
public APPL getAPPL() {
return aPPL;
}
public void setAPPL(APPL aPPL) {
this.aPPL = aPPL;
}
public GOOGL getGOOGL() {
return gOOGL;
}
public void setGOOGL(GOOGL gOOGL) {
this.gOOGL = gOOGL;
}
}
public class APPL {
@SerializedName("quote")
@Expose
private Quote quote;
@SerializedName("stats")
@Expose
private Stats stats;
public Quote getQuote() {
return quote;
}
public void setQuote(Quote quote) {
this.quote = quote;
}
public Stats getStats() {
return stats;
}
public void setStats(Stats stats) {
this.stats = stats;
}
}
public class GOOGL {
@SerializedName("quote")
@Expose
private Quote quote;
@SerializedName("stats")
@Expose
private Stats stats;
public Quote getQuote() {
return quote;
}
public void setQuote(Quote_ quote) {
this.quote = quote;
}
public Stats getStats() {
return stats;
}
public void setStats(Stats stats) {
this.stats = stats;
}
}
public class Quote {
@SerializedName("symbol")
@Expose
private String symbol;
@SerializedName("lastPrice")
@Expose
private double lastPrice;
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public double getLastPrice() {
return lastPrice;
}
public void setLastPrice(double lastPrice) {
this.lastPrice = lastPrice;
}
}
public class Stats {
@SerializedName("dividendRate")
@Expose
private double dividendRate;
public double getDividendRate() {
return dividendRate;
}
public void setDividendRate(double dividendRate) {
this.dividendRate = dividendRate;
}
}
因此,如果我有 Tesla、Facebook 等股票,我必须为每只股票创建新类。
我想知道,我想如何使用 retrofit 来处理上述响应?我可以对上述 API 响应采取什么解决方法,以便我可以使用 retrofit 优雅地处理它们?
如果我可以向API设计者提出以下响应格式,是否有意义,以便应用程序开发人员可以更轻松地处理此类响应?
{
"batch" : [
{
"quote" : {
"symbol": "AAPL",
"lastPrice": 1.23
},
"stats" : {
"dividendRate":2.52
}
},
{
"quote" : {
"symbol": "GOOGL",
"lastPrice": 4.56
},
"stats" : {
"dividendRate":7.89
}
}
]
}
如果使用上面提出的 API 响应,我可以生成更好的 POJO 类。
public class BatchResponse {
@SerializedName("batch")
@Expose
private List<Batch> batch = null;
public List<Batch> getBatch() {
return batch;
}
public void setBatch(List<Batch> batch) {
this.batch = batch;
}
}
public class Quote {
@SerializedName("symbol")
@Expose
private String symbol;
@SerializedName("lastPrice")
@Expose
private double lastPrice;
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public double getLastPrice() {
return lastPrice;
}
public void setLastPrice(double lastPrice) {
this.lastPrice = lastPrice;
}
}
public class Stats {
@SerializedName("dividendRate")
@Expose
private double dividendRate;
public double getDividendRate() {
return dividendRate;
}
public void setDividendRate(double dividendRate) {
this.dividendRate = dividendRate;
}
}
【问题讨论】:
标签: java android json retrofit