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

如何使用referfit和gson解析由[]包围的JSON对象列表?

向修谨
2023-03-14

我创建了一个简单的RESTendpoint:

http://<server_address>:3000/sizes
[
  { "id": 1, "name": "Small", "active": true },
  { "id": 2, "name": "Medium", "active": true },
  { "id": 3, "name": "Large", "active": true }
]
@lombok.AllArgsConstructor
@lombok.EqualsAndHashCode
@lombok.ToString
public class Size {
    private int id;
    private String name;
    private boolean active;

    @SerializedName("created_at")
    private String createdAt;

    @SerializedName("updated_at")
    private String updatedAt;
}
public interface Service {
    @GET("sizes")
    Call<List<Size>> loadSizes();
}

我实例化了一个改型:

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://<server_address>:3000")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

我的服务:

Service service = retrofit.create(Service.class);

现在,尝试调用数据:

service.loadSizes().enqueue(new Callback<List<Size>>() {
    @Override
    public void onResponse(Call<List<Size>> call, Response<List<Size>> response) {
        for(Size size: response.body()) {
            System.out.println(size.toString());
        }
    }

    @Override
    public void onFailure(Call<List<Size>> call, Throwable t) {
        System.out.println(t.getMessage());
    }
});
    null
Type sizesType = new TypeToken<List<Size>>(){}.getType();
List<Size> size = new Gson().fromJson(json, sizesType);

但我不知道如何使改型2使用这个。

提前谢了。

共有1个答案

逄皓轩
2023-03-14

最近我刚完成了一个与Retrifit2相关的项目。基于我的来源,我复制所有你的东西到我的项目中去尝试,做了一些小的改变,它在我这边工作得很好。

在你的构建中。Gradle,添加以下内容:

 compile 'com.squareup.retrofit2:retrofit:2.0.1'
 compile 'com.google.code.gson:gson:2.6.2'
 compile 'com.squareup.okhttp3:okhttp:3.1.2'
 compile 'com.squareup.retrofit2:converter-gson:2.0.1'
 compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'

model:(Update:按照Tommus的例子,createdAt和updatedAt现在显示在他的json响应示例中,这两个值需要注释,因为模型中的名称与json respone不同)

public class Size {
    private int id;
    private String name;
    private boolean active;

    @SerializedName("created_at")
    private String createdAt;

    @SerializedName("updated_at")
    private String updatedAt;
}
public interface service {
    @GET("sizes")
    Call<List<Size>> loadSizes();    
}
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.xiaoyaoworm.prolificlibrary.test.Service;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RestClient {

    private static Service service;

    public static Service getClient() {
        if (service == null) {
            Gson gson = new GsonBuilder()
                    .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                    .create();

            // Add logging into retrofit 2.0
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
            httpClient.interceptors().add(logging);

            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://YOURSERVERIPNOTLOCALHOST:3000/")
                    .addConverterFactory(GsonConverterFactory.create(gson))
                    .client(httpClient.build()).build();

            service = retrofit.create(Service.class);
        }
        return service;
    }
}

在您的活动中,添加这个函数来运行您的代码:(与您所做的完全相同。响应将是您的大小列表)

   private void loadSize() {
        Service serviceAPI = RestClient.getClient();
        Call<List<Size>> loadSizeCall = serviceAPI.loadSizes();
        loadSizeCall.enqueue(new Callback<List<Size>>() {
            @Override
            public void onResponse(Call<List<Size>> call, Response<List<Size>> response) {
                for(Size size: response.body()) {
                    System.out.println(size.toString());
                }
            }

            @Override
            public void onFailure(Call<List<Size>> call, Throwable t) {
                System.out.println(t.getMessage());
            }
        });
    }

下面是我的github repo,我使用Restrofit2.0来实现简单的GET、pos、PUT、DELETE工作。你可以以此作为参考。我的Github Retrofit2.0回购

 类似资料:
  • 问题内容: 我创建了一个简单的REST端点: 此URL返回一个非常简单的响应,其中包含 json数组 ,如下所示: 现在,我尝试 使用带有GSON的Retrofit 2 来 使用此响应 。 我添加了一个模型: 和服务: 我实例化了一个改造: 而我的服务: 现在,尝试调用数据: 最终导致异常: java.lang.IllegalStateException : 预期为BEGIN_OBJECT,但 位

  • 问题内容: 我有一个像这样的JSON对象: 并尝试与Gson解析: 但是“ responceBean”始终为“ null” 这是所有其他类: 这是我的最新尝试。我不知何故找不到正确的方法。任何帮助将不胜感激。 问题答案: 您的 JSON模型与您的对象模型不匹配 。 您需要一个中间层来填补空白: TypeAdapter 。 而且,没有用户的命名信息。 最后是名称不匹配:JSON中的“ worklog

  • 我很难将具有可变内容的JSON对象解析为Java对象。 我的JSON如下所示: 通过一个典型的Json到Java对象转换器运行这段代码是不起作用的,因为它不能映射到一个简单的POJO。 我尝试转换为,但不出所料,出现了一个异常: Edit:正如注释中所指出的,提供的JSON数据不是以有效的键值对形式提供的。我已经联系了API提供商,他们会解决这个问题的。 在我找到一个处理这个问题的方法之前,我将保

  • 我需要使用Gson将传入的json消息解析为Java对象。类“MessageBody”应该用于向Gson提供信息。fromJson(json,MessageBody.class); json消息如下所示。 第一层有三个静态字段。第三个字段(“字段”)是“数据字段”对象的列表。 DataField对象有一个类型字段和一个值字段。它的价值可以是异质的。预期类型为:“字符串”、“int”、“布尔”和“H

  • 我有一个这样的JSON文件: 如何使用Gson仅解析“数据”部分?我的想法是将JSON读入地图,然后用我在GSON中的键“数据”解析普通JSON内容。我能做些更优雅的事吗?

  • 服务器JSON数据显示在活动中使用改造。JSON数据通过gson转换。 给错误:"java.lang.IllegalState异常:预期BEGIN_ARRAY但BEGIN_OBJECT在第1行第2列路径$" JSON格式: 代码: 主要活动。kt