在Android上使用Retrofit的JSON响应

ful*_*oon -1 android json retrofit okhttp3

我可以使用OkHttp3获取JSON响应,我想使用Retrofit来解析响应以从中获取名称和图像.我查看了Retrofit网站和一些教程,但仍然不清楚这个过程.

这是我的OkHttp3代码来获取JSON响应:

 Request request = new Request.Builder().url(url).build();

    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();

        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

            Headers responseHeaders = response.headers();
            for (int i = 0, size = responseHeaders.size(); i < size; i++) {
                System.out.println(responseHeaders.name(i) + responseHeaders.value(i));
            }
            System.out.println(response.body().string());
            String jData = response.body().string();// I want to parse jData using Retrofit

        }
    });
Run Code Online (Sandbox Code Playgroud)

JSON响应如下所示:

在此输入图像描述

我想得到每位艺术家的名字,身份证和形象,非常感谢任何帮助.

UPDATE

我添加了Pojo类,其中一个是Item类:

public class Item {

@SerializedName("external_urls")
@Expose
private ExternalUrls externalUrls;
@SerializedName("followers")
@Expose
private Followers followers;
@SerializedName("genres")
@Expose
private List<Object> genres = new ArrayList<Object>();
@SerializedName("href")
@Expose
private String href;
@SerializedName("id")
@Expose
private String id;
@SerializedName("images")
@Expose
private List<Object> images = new ArrayList<Object>();
@SerializedName("name")
@Expose
private String name;
@SerializedName("popularity")
@Expose
private Integer popularity;
@SerializedName("type")
@Expose
private String type;
@SerializedName("uri")
@Expose
private String uri;

/**
 *
 * @return
 * The externalUrls
 */
public ExternalUrls getExternalUrls() {
    return externalUrls;
}

/**
 *
 * @param externalUrls
 * The external_urls
 */
public void setExternalUrls(ExternalUrls externalUrls) {
    this.externalUrls = externalUrls;
}

/**
 *
 * @return
 * The followers
 */
public Followers getFollowers() {
    return followers;
}

/**
 *
 * @param followers
 * The followers
 */
public void setFollowers(Followers followers) {
    this.followers = followers;
}

/**
 *
 * @return
 * The genres
 */
public List<Object> getGenres() {
    return genres;
}

/**
 *
 * @param genres
 * The genres
 */
public void setGenres(List<Object> genres) {
    this.genres = genres;
}

/**
 *
 * @return
 * The href
 */
public String getHref() {
    return href;
}

/**
 *
 * @param href
 * The href
 */
public void setHref(String href) {
    this.href = href;
}

/**
 *
 * @return
 * The id
 */
public String getId() {
    return id;
}

/**
 *
 * @param id
 * The id
 */
public void setId(String id) {
    this.id = id;
}

/**
 *
 * @return
 * The images
 */
public List<Object> getImages() {
    return images;
}

/**
 *
 * @param images
 * The images
 */
public void setImages(List<Object> images) {
    this.images = images;
}

/**
 *
 * @return
 * The name
 */
public String getName() {
    return name;
}

/**
 *
 * @param name
 * The name
 */
public void setName(String name) {
    this.name = name;
}

/**
 *
 * @return
 * The popularity
 */
public Integer getPopularity() {
    return popularity;
}

/**
 *
 * @param popularity
 * The popularity
 */
public void setPopularity(Integer popularity) {
    this.popularity = popularity;
}

/**
 *
 * @return
 * The type
 */
public String getType() {
    return type;
}

/**
 *
 * @param type
 * The type
 */
public void setType(String type) {
    this.type = type;
}

/**
 *
 * @return
 * The uri
 */
public String getUri() {
    return uri;
}

/**
 *
 * @param uri
 * The uri
 */
public void setUri(String uri) {
    this.uri = uri;
}
Run Code Online (Sandbox Code Playgroud)

}

我在这里如何在我的活动中使用Retrofit:

    private void loadJSON() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://api.spotify.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build();
    final Artists_Interface request = retrofit.create(Artists_Interface.class);

    Call<Item> call = request.getArtists();
    call.enqueue(new Callback<Item>() {
        @Override
        public void onResponse(Call<Item> call, Response<Item> response) {
            if(response.isSuccessful()){
                Item artist = response.body();
                System.out.println("THE NAME::::. : " + artist.getName());
            }
            else{
                System.out.println(" :::. NOO RESPONSE .::: " );
            } 
        }

        @Override
        public void onFailure(Call<Item> call, Throwable t) {
            System.out.println("onFAIL::: " + t);
        }
    });
Run Code Online (Sandbox Code Playgroud)

在这里改造界面如何:

public interface Artists_Interface {

@GET("/v1/search?q=Beyonce&type=artist")
Call<Item> getArtists();
Run Code Online (Sandbox Code Playgroud)

}

我得到artist.getName()等于null.我需要进入JSON主体中"items"内的name,id和images,并将它们传递给listView或recyclerView适配器

Ari*_*Roy 5

这是错的,

Headers responseHeaders = response.headers();
            for (int i = 0, size = responseHeaders.size(); i < size; i++) {
                System.out.println(responseHeaders.name(i) + responseHeaders.value(i));
            }
Run Code Online (Sandbox Code Playgroud)

您正在尝试在标题中查找名称,ID等数据,而信息位于响应正文中.

只需为您的数据模型创建POJO,并从响应对象中将信息检索到模型中.然后,您只需使用getter和setter来访问所需的数据.

UPDATE

您可以使用此站点轻松创建POJO,http://www.jsonschema2pojo.org.只需复制并粘贴您的JSON,它就会立即为您生成POJO.

现在有了POJO,您可以手动解析它,也可以使用GSON或Jackson库轻松完成.

更新2

这里的错误很明显,

Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1
Run Code Online (Sandbox Code Playgroud)

它清楚地表明解析器期望一个数组,但在实际的JSON中找到了一个对象.

看到实际的JSON,它以对象而不是数组开头,那你为什么在这里使用List,

Call<List<Item>> getArtists();
Run Code Online (Sandbox Code Playgroud)

如果你看看你的JSON,你可以看到它以一个对象开始,你在其中有另一个带有关键"艺术家"的对象,然后你有一个带有关键"项目"的项目列表.

您也不需要手动执行任何操作.www.jsonschema2pojo.org会为你生成一切,你只需要包含它们.

我不明白你为什么包含一个List而不是一个对象.

更新3

吸血鬼男人,简单的吸气剂.

假设你有这个,假设.

class Data {

    Artists artists;

    Artists getArtists() {
        return artists;
    }

    class Artists {
        List<Item> list;

        List<Item> getItemList(){
            return  list;
        }
    }

    class Item {
        // You have your item class here
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这样做,

Call<Data> getArtists();
Run Code Online (Sandbox Code Playgroud)

并获得物品,

data.getArtists().getItemList();
Run Code Online (Sandbox Code Playgroud)

那现在清楚了吗?