Android 使用改型将JsonArray作为根解析Json

Android 使用改型将JsonArray作为根解析Json,android,json,gson,retrofit,Android,Json,Gson,Retrofit,这是我的Json。问题是它有一个数组作为节点。我对改装不是很熟练,所以我在试图理解发生了什么以及如何修复它时遇到了一些问题 [ { "first_name":"Jakub", "nickname":"", "last_name":"Machalek", "description":"description1", "speaker_id":0, "image_path":"" }, { "first_name":"Krzysztof"

这是我的Json。问题是它有一个数组作为节点。我对改装不是很熟练,所以我在试图理解发生了什么以及如何修复它时遇到了一些问题

[
{
    "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...
我应该如何解析它?我目前的尝试是这样的

波乔

接口

@GET("...")
Call<List<Speaker>> getSpeakerList();
@GET(“…”)
调用getSpeakerList();

我需要任何帮助。

据我所知,除了您的
扬声器
型号中遗漏了一些东西外,其他一切看起来都不错。因此,在设置改装实例时,您正在使用
gson
转换器。默认情况下,
gson
通过查看json中的键并尝试使用相同的名称设置java对象的属性来序列化和反序列化json

在您的例子中,它尝试在
扬声器
模型中查找属性
first_name
,您没有该属性,因为它是
mFirstName
。因此,如果没有任何进一步的帮助,
gson
实际上无法知道在模型中设置哪个字段

解决这个问题的一个明显方法是将字段命名为
first\u name
。但是,这不是Java中最常见或最理想的字段命名方式,因此
gson
为您提供了
SerializedName
注释。它基本上告诉您Java对象中的字段与json中的哪个字段相关。因此,如果您将您的
扬声器
型号写为:

public class Speaker implements ParentListItem{
  @SerializedName("first_name")
  private String mFirstName;
  @SerializedName("nickname")
  private String mNickname;
  @SerializedName("last_name")
  private String mLastName;
  // ...
}
然后
gson
知道设置和使用哪些字段来反序列化json。改装电话看起来不错。我想你可以忽略
SpeakerList
模型,使用
列表

你也可以考虑使用。严格来说这不是必须的,但可能需要。从文档中:

除非使用GsonBuilder构建Gson并调用GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法,否则此注释无效


非常感谢。我是一个专业的用户,所以我花了一段时间才接受这个答案,但我记得这正是问题所在。谢谢你的回答男人:)我已经接受了下面的答案。抱歉耽搁了。我是个临时用户。现在我开始在工作中更频繁地使用。
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();
public class Speaker implements ParentListItem{
  @SerializedName("first_name")
  private String mFirstName;
  @SerializedName("nickname")
  private String mNickname;
  @SerializedName("last_name")
  private String mLastName;
  // ...
}