Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.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 如何处理API JSON响应,它在JSON名称字段中具有值_Java_Android_Json_Retrofit - Fatal编程技术网

Java 如何处理API JSON响应,它在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

一直以来,我都在使用和,以便让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
            }
    }
}
APPLGOOGL是公司股票代码。我将它们视为
。因此,我不希望它们被放置在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;
    }

}