Java 如何处理API JSON响应,它在JSON名称字段中具有值
一直以来,我都在使用和,以便让Android应用程序与API服务器对话 API服务器使用JSON作为响应 最近,我遇到了与股票相关的反应,看起来是这样的Java 如何处理API JSON响应,它在JSON名称字段中具有值,java,android,json,retrofit,Java,Android,Json,Retrofit,一直以来,我都在使用和,以便让Android应用程序与API服务器对话 API服务器使用JSON作为响应 最近,我遇到了与股票相关的反应,看起来是这样的 { "APPL": { "quote": { "symbol": "AAPL", "lastPrice": 1.23 }, "stats": { "dividendRat
{
"APPL": {
"quote": {
"symbol": "AAPL",
"lastPrice": 1.23
},
"stats": {
"dividendRate":2.52
}
},
"GOOGL": {
"quote": {
"symbol": "GOOGL",
"lastPrice": 4.56
},
"stats": {
"dividendRate":7.89
}
}
}
APPL和GOOGL是公司股票代码。我将它们视为值
。因此,我不希望它们被放置在JSON的名称字段(左侧)
我很难为上述回答生成一组合适的类
如果我将JSON输出直接插入,我得到的结果是
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;
}
}
因此,如果我有特斯拉,Facebook。。。股票,我必须为每种股票创建新的类
我想知道,我该如何使用改装来处理上述响应?对于上面的API响应,我是否可以做一些变通,以便使用改型优雅地处理它们
如果我可以向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;
}
}
公共类批处理响应{
@SerializedName(“批处理”)
@暴露
私有列表批处理=null;
公共列表getBatch(){
退货批次;
}
公共作废收单批次(列表批次){
this.batch=批次;
}
}
公开课报价{
@序列化名称(“符号”)
@暴露
私有字符串符号;
@序列化名称(“最新价格”)
@暴露
私人双价;
公共字符串getSymbol(){
返回符号;
}
公共无效集合符号(字符串符号){
这个符号=符号;
}
公共双getLastPrice(){
退货价格;
}
公共无效setLastPrice(双倍lastPrice){
this.lastPrice=lastPrice;
}
}
公共类统计{
@SerializedName(“dividendRate”)
@暴露
私人双重分割;
公共双getDividendRate(){
返回分隔符;
}
公共无效setDividendRate(双dividendRate){
this.dividendRate=dividendRate;
}
}
我想如何使用改装来处理上述响应?
-您只需要使用同一个类。只需更改SerializedName(“APPL”),例如特斯拉SerializedName(“特斯拉”),因为我们在内部得到了相同的响应。所以我们不需要一次又一次地创建整个类
如果我可以向API设计器提出以下响应格式,以便应用程序开发人员能够更轻松地处理此类响应,这有意义吗?
- 是的,您可以使用这种格式。这是使json动态化的完美解决方案
开发人员在开发用于创建JSON响应的代码的方式背后一定有某种原因。您可能会问的问题是,是否有其他应用程序也锁定了此格式的响应,或者是否有正在开发的应用程序需要此格式的数据等。如果有其他应用程序使用此数据,则@Harminder Singh的答案似乎是正确的。如果此响应仅由您开发的应用程序使用,我看不出以您希望的方式使用它的任何理由,您可以要求开发人员将其更改为您的规范。我设法找到了解决方法 它正在使用字符串到BatchResponse的映射 看起来像
Call<Map<String, BatchResponse>> batchMultipleQuoteStats(@Query("symbols") String symbols);
但是,在运行时如何更改
@SerializedName(“GOOGL”)
?我们不知道什么是即将上市的股票,以及其中有多少。如果你不知道关键点,那么就选择第二个解决方案,让你的json像上面提到的那样动态。
Call<Map<String, BatchResponse>> batchMultipleQuoteStats(@Query("symbols") String symbols);
public class BatchResponse {
@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;
}
}