如何将改造 JSON 响应转换为列表?

Posted

技术标签:

【中文标题】如何将改造 JSON 响应转换为列表?【英文标题】:How to convert retrofit JSON response into List? 【发布时间】:2020-03-20 03:15:09 【问题描述】:

客户端 (Retrofit) 请求存储在服务器 (Rest api) 中的所有技能,这会从 Skill 数据库表中以 JSON 数组的形式返回技能列表。

我想在客户端List<Skill>(技能是 POJO 类)。如何将 Json 响应转换为列表。

这是我的代码:

控制器类(服务器)的方法:

@GetMapping(path = "/skill/all")
    public List<Skill> getAllSkills() 
        List<Skill> skills = skillRepo.findAll();

        for (Skill s : skills) 
            String path = s.getImagePath();
            String fileDownloadUri = ServletUriComponentsBuilder.fromCurrentContextPath()
                    .path(IMAGEPATH+path)
                    .toUriString();
            s.setImagePath(fileDownloadUri);
        

        return skills;
    

SkillActivity.java(客户端):

Retrofit retrofit =apiClient.getRetrofitInstance();
SkillApiService skillApiService = retrofit.create(SkillApiService.class);
        Call<Skill> call = skillApiService.getAllSkills();
        call.enqueue(new Callback<Skill>() 
            @Override
            public void onResponse(Call<Skill> call, Response<Skill> response) 
                if(response.isSuccessful() && response.body() != null)
                    List<Skill> listSkills = new ArrayList<>();

                    //here in List<Skill>, I want to store response, which will be pass in recycerview adapter below

                    recyclerView = findViewById(R.id.recyclerView_skill);
                    recyclerView.setLayoutManager(new GridLayoutManager(getApplicationContext(),3));
                    recyclerView.setAdapter(new RecyclerViewAdapter(getApplicationContext(), listSkills));
                 
            

            @Override
            public void onFailure(Call<Skill> call, Throwable t) 
                Log.d("onFailure",t.getMessage());
            
        );

ApiClient.java

public Class ApiClient
    private static final String BASE_URL = “http://ip:port”;
    public static Retrofit getRetrofitInstance()
        return new  Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(BASE_URL).build();

SkillApiService.java

public interface SkillApiService 

    @GET("/skill/all")
    Call<Skill> getAllSkills();

JsonResponse:给出技能表值。

[
    
        "skillid":1,
        "name":"äbc",
        "imagePath":"<path>",
        "imageName":"abc.png",
        "imagesize":200
    ,
    
        "skillid":2,
        "name":"xyz",
        "imagePath":"<path>",
        "imageName":"xyz.png",
        "imagesize":200
    
]

如何获取列表?

【问题讨论】:

你的界面应该声明Call&lt;List&lt;Skill&gt;&gt; 这给出了一个错误:不匹配的输入异常 响应的json是什么样的? 我已经用 json 响应更新了问题。 更新帖子,了解retrofit.create(SkillApiService.class) 中的retrofit 对象是如何构建的 【参考方案1】:

对于此转换,您应该使用 TypeReference

List<Skill> participantJsonList = mapper.readValue(jsonString, new TypeReference<List<Skill>>());

【讨论】:

嘿,我应该在 jsonString 中写什么。我有一个 POJO 类的响应。我收到一个错误,无法从 START_ARRAY 令牌中反序列化 Skill 实例 @rupal3112,请将您的 json 数组转换为 json 字符串。谢谢

以上是关于如何将改造 JSON 响应转换为列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何选择 JSON 的特定部分并将其转换为使用 Moshi 改造的列表

如何将改造回调响应中的回调从 java 转换为 Kotlin

如何将JSON响应转换为Java List-使用Rest Assured进行API测试

改造 POST 响应转换失败,无影无踪

使用改造将不一致的 JSON 解析为 POJO

如何将对象响应对象的猫鼬聚合数组转换为json对象响应