GSON 的改造解析问题
Posted
技术标签:
【中文标题】GSON 的改造解析问题【英文标题】:Retrofit parsing issue with GSON 【发布时间】:2018-01-04 03:32:56 【问题描述】:我知道这个问题已经被问过很多次了。但是我无法理解这个问题。
我遇到了错误。
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
下面是我的代码。
PriceInterface priceInterface = ApiClient.getClient().create(PriceInterface.class);
Map<String, String> params = new HashMap<String, String>();
params.put("date", "today");
params.put("circle", "Chandigarh");
Call<PriceListBean> call = priceInterface.getMyThing(params);
call.enqueue(new Callback<PriceListBean>()
@Override
public void onResponse(Call<PriceListBean> call, Response<PriceListBean> response)
Log.e("response is","++++"+response.body().toString());
@Override
public void onFailure(Call<PriceListBean> call, Throwable t)
Log.e("failure message is",""+t.getLocalizedMessage());
// t.getLocalizedMessage();
);
以下是我从服务器获取的 json。
"price": [
"id": 678,
"date_time": "2017-07-25",
"type": "Diesel",
"place": "Chandigarh",
"price": "55.75"
,
"id": 639,
"date_time": "2017-07-25",
"type": "Petrol",
"place": "Chandigarh",
"price": "64.74"
],
"errorCode": 0,
"errorDesc": "Success"
我为此创建了 Pojo。
public class PriceListBean
@SerializedName("price")
@Expose
private List<Price> price = null;
@SerializedName("errorCode")
@Expose
private Integer errorCode;
@SerializedName("errorDesc")
@Expose
private String errorDesc;
public List<Price> getPrice()
return price;
public void setPrice(List<Price> price)
this.price = price;
public Integer getErrorCode()
return errorCode;
public void setErrorCode(Integer errorCode)
this.errorCode = errorCode;
public String getErrorDesc()
return errorDesc;
public void setErrorDesc(String errorDesc)
this.errorDesc = errorDesc;
这可以通过 Volley 或 Gson 轻松完成,但是当我尝试使用 Retrofit 时,我陷入了困境。我不确定我是否得到正确的 json 格式
【问题讨论】:
您可能得到了错误的 json 数据。转换器期待一个 JsonObject ,但它却得到了 String 。请在休息客户端中检查您的 api,并在此处发布回复。 @SureshKumar 我已经检查了浏览器上的数据。还有邮递员。他们都显示正确的格式。不知道如何在我的代码中看到响应。 可能是因为“价格”键同时出现在 json 的第一级和第二级? 此代码在制作 Price 类字符串的所有字段时工作正常。所以我认为问题出在您的 Price 类中,您可以添加该类的来源吗? 您可以做一件事来检查您是否获得了正确的响应或不添加响应拦截器并检查您的 rawResponse。如果您不知道我可以添加代码作为答案,我不会这样做,因为它不是您问题的一部分。 【参考方案1】:您能否向我们提供您的 Price 对象 在我的脑海中,您的 Price 课程应该看起来像这样
public class Price
@SerializedName("id")
@Expose
private long id;
@SerializedName("date_time")
@Expose
private String date_time;
@SerializedName("type")
@Expose
private String type;
@SerializedName("place")
@Expose
private String place;
@SerializedName("price")
@Expose
private String price;
public void setId(long id)
this.id = id;
public long getId()
return this.id;
public void setDate_time(String date_time)
this.date_time = date_time;
public String getDate_time()
return this.date_time;
public void setType(String type)
this.type = type;
public String getType()
return this.type;
public void setPlace(String place)
this.place = place;
public String getPlace()
return this.place;
public void setPrice(String place)
this.price = price;
public String getPrice()
return this.price;
试试这个代替你当前的 Price 对象,如果错误仍然存在,让我们知道。
【讨论】:
【参考方案2】:您的响应获取数据列表,然后更改此代码..
Log.e("response is","++++"+response.body().toString());
并在下面的代码中使用..
@Override
public void onResponse(Call<PriceListBean> call, Response<PriceListBean> response)
List<PriceListBean> data=response.body();
// Log.e("response is","++++"+response.body().toString());
我希望您将以下依赖项添加到应用程序级别的 gradle 文件中..
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
【讨论】:
以上是关于GSON 的改造解析问题的主要内容,如果未能解决你的问题,请参考以下文章