当前位置: 首页 > 知识库问答 >
问题:

使用Gson多态json解析的改型2

裴鸿熙
2023-03-14
{
"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的子类。但是我不知道如何解析对我的用户或组织模型的响应。

共有1个答案

万俟亦
2023-03-14

使用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个,但是只有两个。到目前为止,这是我在课堂上要解析的内容: 所以我这样访问数据: 但是正如您所看到的,这将是很长的时间。另一个问题是某些“值”中包含“&”号,这意味着我不能在此