Как я могу разобрать объект json с помощью дооснащения и recyclerView - PullRequest
0 голосов
/ 04 ноября 2019

Я использую GitHub API для отображения в своем приложении самого популярного репозитория, их имен, аватара и описания в recyclerView, но когда я запускаю приложение, все работает, но avatar_url и login возвращают Null.

это JSON от Github API

https://api.github.com/search/repositories?q=created:%3E2019-10-01&sort=stars&order=desc

Я пробовал это: класс клиента:

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Client {
    public static final String BASE_URL="https://api.github.com";
    public static Retrofit retrofit=null;

    public static Retrofit getClient()
    {
        if(retrofit==null)
        {
            retrofit=new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();

        }
        return retrofit;
    }
}

Класс обслуживания:

package com.example.gethubapi.api;

import com.example.gethubapi.model.ItemResponse;

import retrofit2.Call;
import retrofit2.http.GET;

public interface Service {

    @GET("/search/repositories?q=created:>2017-10-22&sort=stars&order=desc&page=2")
    Call<ItemResponse> getItems();
}

Класс изделия В этом проблема, если вы проверили файл jSON по ссылке выше, вы будетенайти дочерний объект из элемента, называемого владельцем, и я не могу выбрать имя avatar_url и имя владельца напрямую

 import com.google.gson.annotations.SerializedName;

    public class Item {
        @SerializedName("avatar_url")
        @Expose
        private String avatarUrl;

        @SerializedName("name")
        @Expose
        private String name;

        @SerializedName("description")
        @Expose
        private String description;

        @SerializedName("login")
        @Expose
        private String owner;

        @SerializedName("stargazers_count")
        @Expose
        private int stargazers;

        public Item(String avatar_url,String name,String description,String owner,int stargazers )
        {
            this.avatarUrl=avatar_url;
            this.name=name;
            this.description=description;
            this.owner=owner;
            this.stargazers=stargazers;

        }
        public String getAvatarUrl()
        {
            return avatarUrl;
        }
        public String getName()
        {
            return name;
        }
        public String getDescription()
        {
            return description;
        }
        public String getOwner()
        {
            return owner;
        }
        public int getStargazers()
        {
            return stargazers;
        }
    }

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Глядя на ответ JSON, объект Owner является частью объекта Item. это означает, что он вложен в объект Item.

public class Owner {
@SerializedName("avatar_url")
@Expose
private String avatarUrl;

@SerializedName("login")
@Expose
 private String login;

 public Owner(){}

 public void setAvatarUrl(String avatar_URL){
 this.avatarUrl = avatar_URL;
 }

 pubic String getAvatarUrl(){
 return avatarUrl;
 }

 public String getLogin(){
  return login;
 }

 public void setLogin(String login){
  this.login = login;}
  }

public class Item {
    @SerializedName("name")
    @Expose
    private String name;

    @SerializedName("description")
    @Expose
    private String description;

    @SerializedName("owner")
    @Expose
    private Owner owner;

     @SerializedName("stargazers_count")
    @Expose
    private int stargazers;
    .........
    }
0 голосов
/ 04 ноября 2019

Поскольку логин и avatar_url находятся под владельцем объекта. Вам нужно создать отдельный класс для объекта-владельца, так же, как вы это сделали для одного элемента. И не забудьте упомянуть класс объекта в вашем классе Item.

...