gpt4 book ai didi

android - 使用 Retrofit 解析以 JsonArray 作为根的 Json

转载 作者:行者123 更新时间:2023-12-02 17:16:59 24 4
gpt4 key购买 nike

这是我的 Json。它的问题是它有一个数组作为节点。我对 Retrofit 不太熟悉,因此在尝试了解发生了什么以及如何解决它时遇到了一些问题。

[
{
"first_name":"Jakub",
"nickname":"",
"last_name":"Machalek",
"description":"description1",
"speaker_id":0,
"image_path":""
},
{
"first_name":"Krzysztof",
"nickname":"",
"last_name":"Opasik",
"description":"Description2",
"speaker_id":1,
"image_path":""
},
...etc...

我该如何解析它?我目前的尝试是这样的

POJO

public class Speaker implements ParentListItem{
private String mFirstName;
private String mNickname;
private String mLastName;
private String mDescription;
private String mImageUrl;

private ArrayList<Speaker> mChildrenList;

public Speaker(String mFirstName, String mNickname, String mLastName, String mDescription, String mImageUrl) {
this.mFirstName = mFirstName;
this.mNickname = mNickname;
this.mLastName = mLastName;
this.mDescription = mDescription;
this.mImageUrl = mImageUrl;
mChildrenList = new ArrayList<>();
mChildrenList.add(this);
}

public String getFirstName() {
return mFirstName;
}

public void setFirstName(String mFirstName) {
this.mFirstName = mFirstName;
}

public String getNickname() {
return mNickname;
}

public void setNickname(String mNickname) {
this.mNickname = mNickname;
}

public String getLastName() {
return mLastName;
}

public void setLastName(String mLastName) {
this.mLastName = mLastName;
}

public String getDescription() {
return mDescription;
}

public void setDescription(String mDescription) {
this.mDescription = mDescription;
}

public String getImageUrl() {
return mImageUrl;
}

public void setImageUrl(String mImageUrl) {
this.mImageUrl = mImageUrl;
}

@Override
public List<?> getChildItemList() {
return mChildrenList;
}

@Override
public boolean isInitiallyExpanded() {
return false;
}

还有

public class SpeakerList {

List<Speaker> speakerList;


public List<Speaker> getSpeakerList() {
return speakerList;
}

public void add(Speaker nataCenterItem){
if(speakerList == null){
speakerList = new LinkedList<>();
}
speakerList.add(nataCenterItem);
}

改造 公共(public)类 SessionInfoService { 私有(private) SessionInfoApi sessionInfoApi;

public SessionInfoService(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("...")
.addConverterFactory(GsonConverterFactory.create())
.build();
sessionInfoApi = retrofit.create(SessionInfoApi.class);
}

public void getLectureList(Callback callback) throws IOException {
sessionInfoApi.getLectureList().enqueue(callback);
}

public void getSpeakerList(Callback callback) throws IOException {
sessionInfoApi.getSpeakerList().enqueue(callback);
}

界面

@GET("...")
Call<List<Speaker>> getSpeakerList();

我需要任何帮助。

最佳答案

据我所知,一切看起来都不错,除了你在 Speaker 中遗漏了一些东西。模型。因此,当您设置改造实例时,您将使用 gson转换器。默认gson通过查看 json 中的键并尝试设置具有相同名称的 java 对象的属性来序列化和反序列化 json。

在您的情况下,它会尝试查找例如属性 first_name在你的Speaker模型,您没有该模型,因为它是 mFirstName 。因此,无需任何进一步的帮助,gson实际上无法知道要在模型中设置哪个字段。

解决此问题的一个明显方法是将您的字段命名为 first_name 。但是,这不是 Java 中命名字段的最常见或最理想的方式,因此 gson为您提供SerializedName注解。它基本上告诉了Java对象中的字段与json中的哪个字段相关。所以如果你写你的 Speaker模型为:

public class Speaker implements ParentListItem{
@SerializedName("first_name")
private String mFirstName;
@SerializedName("nickname")
private String mNickname;
@SerializedName("last_name")
private String mLastName;
// ...
}

然后gson知道要设置哪些字段并使用哪些字段来反序列化和序列化 json。 Retrofit 调用看起来不错。我想你可以忽略 SpeakerList模型并使用List<Speaker>就像你一样。

您也可以考虑使用 Expose Annotation 。这并不是绝对必要的,但可能是需要的。来自文档:

This annotation has no effect unless you build Gson with a GsonBuilder and invoke GsonBuilder.excludeFieldsWithoutExposeAnnotation() method.

关于android - 使用 Retrofit 解析以 JsonArray 作为根的 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com