{
"Information": {
"Id": "2dbc0dad8df94f7de7b63d8f22a03c8f",
"Type": "User",
"Name": "ASD",
"IsInProgress": false
},
"Errors": []
}
{
"Information": {
"Id": "2dbc0dad8df94f7ca6b66d5f22a03c8f",
"Type": "Organization",
"Name": "ASD",
"City": "London"
"Street": "Wall street"
},
"Errors": []
}
public class DetailConverterFactory extends Converter.Factory {
private Gson gson;
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if (gson == null){
final RuntimeTypeAdapterFactory<DetailInformation> typeFactory = RuntimeTypeAdapterFactory
.of(DetailInformation.class, "Type") // Here you specify which is the parent class and what field particularizes the child class.
.registerSubtype(User.class, "User");
.registerSubtype(Organization.class, "Organization");
// add the polymorphic specialization
gson = new GsonBuilder().registerTypeAdapterFactory(typeFactory).create();
}
TypeAdapter<?> gsonAdapter = gson.getAdapter(TypeToken.get(type));
return new CustomResponseBodyConverter<>(gsonAdapter, gson); //super.responseBodyConverter(type, annotations, retrofit);
}
private class CustomResponseBodyConverter<T> implements Converter<ResponseBody, T>{
private TypeAdapter<T> gsonAdapter;
private Gson gson;
public CustomResponseBodyConverter(TypeAdapter<T> gsonAdapter, Gson gson) {
this.gsonAdapter = gsonAdapter;
this.gson = gson;
}
@Override
public T convert(ResponseBody value) throws IOException {
JsonReader jsonReader = gson.newJsonReader(value.charStream());
try{
return gsonAdapter.read(jsonReader);
} finally {
value.close();
}
}
}
}
Callback<DetailModel> detailModelCallback = new Callback<DetailModel>() {
@Override
public void onResponse(Call<DetailModel> call, Response<DetailModel> response) {
final DetailModel detailResponse = new RetrofitObjectExtractor<>(DetailModel.class).extract(response);
if (detailResponse == null){
// TODO error handling
Log.d("ERR", " detail null :(");
}else {
Log.d("OK", "good");
}
}
@Override
public void onFailure(Call<DetailModel> call, Throwable t) {
Log.d("ERR", "fail");
}
但是我的DetailModel是一个基类,我的user.class和organization.class是DetailModel的子类。但是我不知道如何解析对我的用户或组织模型的响应。
使用Retrofit2+GSON解析响应,就像这样:
String baseurl="http://";
Retrofit retrofit = new Retrofit
.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(baseurl)
.build();
HttpApi httpApi = retrofit.create(HttpApi.class);
Call<DetailModel> call= httpApi.getData();
call.enqueue(new Callback<DetailModel>() {
@Override
public void onResponse(Call<DetailModel> call, Response<DetailModel> response) {
//todo
}
@Override
public void onFailure(Call<DetailModel> call, Throwable t) {
//todo
}
});
DetailModel:
public class DetailModel {
public InformationBean Information;
public List<?> Errors;
public static class InformationBean {
public String Id;
public String Type;
public String Name;
public String City;
public String Street;
public boolean IsInProgress;
}
}
interface HttpApi {
@GET("home")
Call<DetailModel> getData();
我是新来改装的。我已经在大多数Web服务中使用了volley,决定继续改进。但是我被Json解析所困,我在POJO类中得到了空数据。我尝试通过检查响应,我的响应是正确的,当我在模型类中解析时,我得到的是空白数据。请指导我,任何帮助都将不胜感激。 注意:POJO类是可parcelable,还包含cunstructor和gette/setter。我从这里删除了它,因为文本限制。 JSON响应
其答复如下: 我相信问题出在响应前面的jsonFlickrApi上。 执行以下代码时: }
我正在使用凌空OkHttp从服务器获取一些数据。 响应是一个包含JSON的字符串,我想使用GSON/POJO解析它。 我得到错误: 预期BEGIN_OBJECT,但在第1行第1列路径$上是STRING 尝试解析时。 原因:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第1列路径$ com.google.gson.stream.JsonRead
问题内容: 我已经尝试了所有方法,但是解决方案非常丑陋,我真的想要一个直接的答案,是否可以改进(这意味着是否需要使用其他实现)。 问题在于带有GSON的Map of Maps: 根据Firebug给我以下回应: 大约有200个,但是只有两个。到目前为止,这是我在课堂上要解析的内容: 所以我这样访问数据: 但是正如您所看到的,这将是很长的时间。另一个问题是某些“值”中包含“&”号,这意味着我不能在此