Java 改型2(在Android中)实现后,我的JSON元素在哪里?
我正在实现一个改型2接口来解析JSON元素(视频URL、缩略图、标题等) JSONschema2Pojo产生了4个pojo类,但主/根类是VideoInfo(更不用说实现Parcelable,我还没有对它做任何事情) 如果知道这是由jsonschema2pojo自动生成的,那么缺少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.
@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()
方法从pojoItem
移动到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