【问题标题】:Retrofit GSON Parsing dynamic repsonse (key names unknown)改造 GSON 解析动态响应(键名未知)
【发布时间】:2018-08-03 02:07:04
【问题描述】:

我正在尝试在改造/gson 中解析下面的 json 响应,特别是 this json

{  
   "Coincheck":{  
      "BTC":[  
         "JPY"
      ]
   },
   "QuadrigaCX":{  
      "ETH":[  
         "CAD",
         "BTC"
      ],
      "BTC":[  
         "USD",
         "CAD"
      ]
   }
   // ... more data
}

我尝试使用 Map>

public class ExchangeResp
{
    Map<String, Map<String, List<String>>> exchanges;

    public Map<String, Map<String, List<String>>> getExchanges()
    {
        return exchanges;
    }
}

但我总是将 response.body() 设为空。我是否需要创建实现 JsonDeserializer 的自定义 json 反序列化器并传递给 gson builder?

【问题讨论】:

  • 你的改造 Call 泛型类型 T 是什么?你能得到它 Call 并得到一个 json 字符串作为响应吗?
  • @pirho 我尝试了 Call,如果我使用 ScalarsConverterFactory,它就可以工作,而使用 GsonConverterFactory 我得到了一个异常 Expected a string but was BEGIN_OBJECT。早些时候,我将 Call 与 GsonConverterFactory 一起使用,但在我更改为 Call>>> 后它不起作用。谢谢您的帮助!我有两种解析响应的方法。

标签: gson retrofit retrofit2


【解决方案1】:

使用你的响应类作为

import com.google.gson.annotations.SerializedName;

import java.util.List;


public class Reposne {

@SerializedName("Coincheck")
private Coincheck coincheck;

@SerializedName("QuadrigaCX")
private QuadrigaCX quadrigaCX;

public Coincheck getCoincheck() {
    return coincheck;
}

public void setCoincheck(Coincheck coincheck) {
    this.coincheck = coincheck;
}

public QuadrigaCX getQuadrigaCX() {
    return quadrigaCX;
}

public void setQuadrigaCX(QuadrigaCX quadrigaCX) {
    this.quadrigaCX = quadrigaCX;
}

class Coincheck {
    @SerializedName("BTC")
    private List<String> btc;

    public List<String> getBtc() {
        return btc;
    }

    public void setBtc(List<String> btc) {
        this.btc = btc;
    }
}

class QuadrigaCX {
    @SerializedName("ETH")
    private List<String> eth;
    @SerializedName("BTC")
    private List<String> btc;

    public List<String> getEth() {
        return eth;
    }

    public void setEth(List<String> eth) {
        this.eth = eth;
    }

    public List<String> getBtc() {
        return btc;
    }

    public void setBtc(List<String> btc) {
        this.btc = btc;
    }
}

}

【讨论】:

  • 感谢您的回复。我实际上是在尝试解析动态的 json 响应,我想将键名视为未知。我更新了问题。
【解决方案2】:

添加以下三个模型类

    public class Item {

@SerializedName("Coincheck")
@Expose
private Coincheck coincheck;
@SerializedName("QuadrigaCX")
@Expose
private QuadrigaCX quadrigaCX;

public Coincheck getCoincheck() {
return coincheck;
}

public void setCoincheck(Coincheck coincheck) {
this.coincheck = coincheck;
}

public QuadrigaCX getQuadrigaCX() {
return quadrigaCX;
}

public void setQuadrigaCX(QuadrigaCX quadrigaCX) {
this.quadrigaCX = quadrigaCX;
}

}

Coincheck.java

    public class Coincheck {

@SerializedName("BTC")
@Expose
private List<String> bTC = null;

public List<String> getBTC() {
return bTC;
}

public void setBTC(List<String> bTC) {
this.bTC = bTC;
}

}

QuadrigaCX

    public class QuadrigaCX {

@SerializedName("ETH")
@Expose
private List<String> eTH = null;
@SerializedName("BTC")
@Expose
private List<String> bTC = null;

public List<String> getETH() {
return eTH;
}

public void setETH(List<String> eTH) {
this.eTH = eTH;
}

public List<String> getBTC() {
return bTC;
}

public void setBTC(List<String> bTC) {
this.bTC = bTC;
}

}

你使用 retrfit 的网络调用应该是这样的

 call1.enqueue(new Callback<Item>() {
            @Override
            public void onResponse(Call<Item> call, Response<Item> response) {

            }

            @Override
            public void onFailure(Call<Item> call, Throwable t) {

            }


        });

【讨论】:

  • 感谢您的回复。我实际上是在尝试解析动态的 json 响应,我想将键名视为未知。我更新了问题。
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多