Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 改型2(在Android中)实现后,我的JSON元素在哪里?_Java_Android_Json_Retrofit_Retrofit2 - Fatal编程技术网

Java 改型2(在Android中)实现后,我的JSON元素在哪里?

Java 改型2(在Android中)实现后,我的JSON元素在哪里?,java,android,json,retrofit,retrofit2,Java,Android,Json,Retrofit,Retrofit2,我正在实现一个改型2接口来解析JSON元素(视频URL、缩略图、标题等) JSONschema2Pojo产生了4个pojo类,但主/根类是VideoInfo(更不用说实现Parcelable,我还没有对它做任何事情) 如果知道这是由jsonschema2pojo自动生成的,那么缺少@SerializedName(“…”)会影响任何事情吗?更新:生成了新的pojo类,这次带有Gson注释(@SerializedName(“”)和@Expose),但仍然存在相同的问题 import android.

我正在实现一个改型2接口来解析JSON元素(视频URL、缩略图、标题等)

JSONschema2Pojo产生了4个pojo类,但主/根类是VideoInfo(更不用说实现Parcelable,我还没有对它做任何事情) 如果知道这是由jsonschema2pojo自动生成的,那么缺少
@SerializedName(“…”)
会影响任何事情吗?更新:生成了新的pojo类,这次带有Gson注释
(@SerializedName(“”)和@Expose)
,但仍然存在相同的问题

import android.os.Parcel;
import android.os.Parcelable;

import java.util.ArrayList;
import java.util.List;

public class VideoInfo implements Parcelable {

    private List<Item> items = new ArrayList<Item>();
    private int pageNumber;
    private int pageSize;
    private int totalCount;

    /**
     * No args constructor for use in serialization
     * 
     */
    public VideoInfo() {
    }

    /**
     * 
     * @param totalCount
     * @param items
     * @param pageSize
     * @param pageNumber
     */
    public VideoInfo(List<Item> items, int pageNumber, int pageSize, int totalCount) {
        this.items = items;
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        this.totalCount = totalCount;
    }

    /**
     * 
     * @return
     *     The items
     */
    public List<Item> getItems() {
        return items;
    }

    /**
     * 
     * @param items
     *     The items
     */
    public void setItems(List<Item> items) {
        this.items = items;
    }

    /**
     * 
     * @return
     *     The pageNumber
     */
    public int getPageNumber() {
        return pageNumber;
    }

    /**
     * 
     * @param pageNumber
     *     The page_number
     */
    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }

    /**
     * 
     * @return
     *     The pageSize
     */
    public int getPageSize() {
        return pageSize;
    }

    /**
     * 
     * @param pageSize
     *     The page_size
     */
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 
     * @return
     *     The totalCount
     */
    public int getTotalCount() {
        return totalCount;
    }

    /**
     * 
     * @param totalCount
     *     The total_count
     */
    public void setTotalCount(int totalCount) {
        this.totalCount = totalCount;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {

    }


}
我已经创建了一个改装接口VideoInterface.class

2.电话;; 导入文件2.http.GET

/**
* retrofit 2 interface
 */
public interface VideoInterface {
    String apiURL = ".....";

    @GET(apiURL)
    public Call<VideosResponse> listVideos();
}
到最后一步的一切似乎都正常(没有错误),以下日志为我提供了:

        Log.d("Videos ", response.message()); //OK
        Log.d("Videos ", String.valueOf(response.isSuccess())); //TRUE
        Log.d("Videos ", String.valueOf(response.code())); //200

但我仍然无法得到我需要的字符串。当我打印响应日志时,显示响应
VideosResponse videoResponse=response.body()我得到:VideosResponse@3b8bfaa4,这正常吗?我怎么用这个?
建议使用包裹吗?它会改变什么吗?

在VideoInfo类中添加一个toString(),然后在响应时,您可以使用以下内容记录返回列表中的单个对象

用于(视频信息:视频响应) Log.d(Log_标签,“VideoInfo:+VideoInfo.toString())

我知道我应该能够做一些类似于response.body().item.getID()的事情,例如

嗯,不,不是根据我理解的代码

  • response
    这里似乎是
    response-response
  • response.body()
    因此将是一个
    VideosResponse
  • response.body().item
    将失败,因为
    VideosResponse
    没有
    item
    字段

当我打印响应日志时,显示响应VideosResponse videoResponse=response.body();我得到:VideosResponse@3b8bfaa4,这正常吗

对。这是未重写
toString()
的Java对象的默认
toString()
输出。这表明
response.body()
是一个
VideosResponse

我已经创建了一个响应/解析类VideosResponse.java

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.ArrayList;
import java.util.List;

/**
 */
public class VideosResponse {
//initalizing the collection
        List<VideoInfo> videos;

        public VideosResponse() {
            videos = new ArrayList<VideoInfo>();
        }
//parsing the response
    public static VideosResponse parseJSON(String response) {
        Gson gson = new GsonBuilder().create();
        VideosResponse videosResponse = gson.fromJson(response, VideosResponse.class);

        return videosResponse;
    }
}
然后您就知道,
VideosResponse
没有任何名为
的项
。Gson不会向类中添加方法;它仅基于解析一些JSON来填充这些类的实例


如果您希望
VideosResponse
有一个
item
字段,请确保JSON中存在该字段,然后编辑
VideosResponse
以有一个
item
字段。

您需要向我们显示JSON响应,或者您也可以自己确定。基本上,对象属性名称必须与json属性匹配,您可以调试以查看元素是否接收到值,如果没有,则向其添加SerializedName注释。从那时起,有两种可能性,一种是对象,另一种是数组。您可以为其进一步创建POJO或创建List类型的属性。

您没有使用此
VideosResponse videoResponse=response.body()
anywhere?仅用于日志记录,不使用它执行任何操作。您如何读取响应?尝试了上面的videoResponse.getItem(),pojo中定义的一些getter,但这对我没有任何帮助。当我打印响应日志时,显示响应
videoResponse videoResponse=response.body()我得到:
VideosResponse@3b8bfaa4
,这正常吗?如何使用它?如果我想返回几个元素,那么创建toString()方法将是一件棘手的事情,我正在寻找一个更好的实践解决方案,特别是我使用的是改型,这是一个很棒的工具。但是感谢您的帮助。@user3549911如果您从未实现toString(),因为它有一个自动函数为您生成toString,那么您不能简单地从对象打印。alt+insert、control+enter(mac)这对于没有超越默认toString()方法的每个对象都是正确的。但请注意,我使用的是改型,它负责API调用和解析,因此通常我可以通过编写类似于
response.body().getID().getTitle()的内容,从改型返回的响应对象中获取JSON元素。我的问题是写作在我的情况下不起作用。@user3549911我不太确定我是否理解你想做什么。我已经更新了问题,请阅读上面答案的注释。感谢你的回答,我已经用粗体更新了问题,添加了另外两个pojo类(
&
格式副本
)。并更新了我想要获取的JSON元素
response.body().getItem().getID().getRendition().getUrl()
,(来自VideoInfo对象的项目->来自项目对象列表的项目->项目ID和项目URL),因为我的最终目标是获取要播放的视频URL列表。但是,我在自动完成中没有看到这些方法。我缺少什么?@user3549911:
VideosResponse
没有
getItem()
方法。我是否要将
getItem()
方法从pojo
Item
移动到
VideoResponse
?对于这个问题,其他JSON元素的所有getter是什么?我的想法是改造
VideoResponse
了解
VideoInfo
pojo,它了解
对象列表,它了解
格式副本
列表,从中获取视频的URL
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.ArrayList;
import java.util.List;

/**
 */
public class VideosResponse {
//initalizing the collection
        List<VideoInfo> videos;

        public VideosResponse() {
            videos = new ArrayList<VideoInfo>();
        }
//parsing the response
    public static VideosResponse parseJSON(String response) {
        Gson gson = new GsonBuilder().create();
        VideosResponse videosResponse = gson.fromJson(response, VideosResponse.class);

        return videosResponse;
    }
}
        // Creating a simple REST adapter which points the API

//        public static
        final String BASE_URL = "http://api......";
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        // Creating an instance of our API interface.

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

        Call<VideosResponse> call = service.listVideos();
        call.enqueue(new Callback<VideosResponse>() {
            @Override
            public void onResponse(Call<VideosResponse> call, Response<VideosResponse> response) {
                VideosResponse videoResponse = response.body();

            }

            @Override
            public void onFailure(Call<VideosResponse> call, Throwable t) {

            }});
        Log.d("Videos ", response.message()); //OK
        Log.d("Videos ", String.valueOf(response.isSuccess())); //TRUE
        Log.d("Videos ", String.valueOf(response.code())); //200