Android 改造数组列表中嵌套的 JSON 个对象
Android Retrofit nested JSON objects in arraylist
我正在使用 PokeApi 创建一个 android 应用程序。我正在使用 Retrofit 库来解析数据。
我的 API 看起来像这样:
{
"abilities": [2 items],
"base_experience": 64,
"forms": [1 item],
"game_indices": [20 items],
"height": 7,
"held_items": [],
"id": 1,
"is_default": true,
"location_area_encounters": "https://pokeapi.co/api/v2/pokemon/1/encounters",
"moves": [78 items],
"name": "bulbasaur",
"order": 1,
"past_types": [],
"species": {2 items},
"sprites": {10 items},
"weight": 69,
"stats": [
{
"base_stat": 45,
"effort": 0,
"stat": {
"name": "hp",
"url": "https://pokeapi.co/api/v2/stat/1/"
}
},
{
"base_stat": 49,
"effort": 0,
"stat": {
"name": "attack",
"url": "https://pokeapi.co/api/v2/stat/2/"
}
},
.
....
}
我能够记录 name
、weight
和 height
等值,但无法获取值 stats
内的项目作为数组。我还需要嵌套在 stats
中的 stat
(name
和 url
)。
这是我所做的。
这是我的模型 类.
public class PokeDetail {
private String name;
private String height;
private String weight;
@SerializedName("stats")
@Expose
private List<PokeStats> stats = null;
public List<PokeStats> getStats() {
return stats;
}
public void setStats(List<PokeStats> stats) {
this.stats = stats;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
}
public class PokeStats {
private String effort;
public String getEffort() {
return effort;
}
public void setEffort(String effort) {
this.effort = effort;
}
}
这是我的 MainActivity 的样子:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://pokeapi.co/api/v2/")
.addConverterFactory(GsonConverterFactory.create())
.build();
PokeApiService pokeApiService = retrofit.create(PokeApiService.class);
Call<PokeDetail> call = pokeApiService.getPokeDetails(pokeNum);
call.enqueue(new Callback<PokeDetail>() {
@Override
public void onResponse(Call<PokeDetail> call, Response<PokeDetail> response) {
if(!response.isSuccessful()){
Log.i("ERROR", "onResponse: " + response.code());
}
PokeDetail pokeDetails = response.body();
Log.i("NAME", pokeDetails.getName());
Log.i("Height", pokeDetails.getHeight());
Log.i("Weight", pokeDetails.getWeight());
List<PokeStats> p = pokeDetails.getStats();
Log.i("ListDATA", p.toString());
}
@Override
public void onFailure(Call<PokeDetail> call, Throwable t) {
Log.i("ERROR", t.getMessage());
}
});
这是我的输出:
Log not proper Issue
你看到的是 toString
的默认版本,如果你想以你的方式登录然后覆盖它。请参阅下面的示例 class。
I need stat (name and url) which is nested inside stat
您的 PokeStats
class 中需要有 stat
密钥。
示例:
public class PokeStats {
@SerializedName("base_stat")
@Expose
private Integer baseStat;
@SerializedName("effort")
@Expose
private Integer effort;
@SerializedName("stat")
@Expose
private Stat stat;
public Integer getBaseStat() {
return baseStat;
}
public void setBaseStat(Integer baseStat) {
this.baseStat = baseStat;
}
public Integer getEffort() {
return effort;
}
public void setEffort(Integer effort) {
this.effort = effort;
}
public Stat getStat() {
return stat;
}
public void setStat(Stat stat) {
this.stat = stat;
}
@Override
public String toString() {
return "PokeStats{" +
"baseStat=" + baseStat +
", effort=" + effort +
", stat=" + stat.toString() +
'}';
}
}
& 嵌套 Stat
class:
public class Stat {
@SerializedName("name")
@Expose
private String name;
@SerializedName("url")
@Expose
private String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Stat{" +
"name='" + name + '\'' +
", url='" + url + '\'' +
'}';
}
}
建议:
如果您需要为此类错误响应制作 classes,您可以使用像这样的在线工具:https://www.jsonschema2pojo.org/
输入您的回复和选择 JSON
,GSON
相应的选项并生成 classes.
我正在使用 PokeApi 创建一个 android 应用程序。我正在使用 Retrofit 库来解析数据。 我的 API 看起来像这样:
{
"abilities": [2 items],
"base_experience": 64,
"forms": [1 item],
"game_indices": [20 items],
"height": 7,
"held_items": [],
"id": 1,
"is_default": true,
"location_area_encounters": "https://pokeapi.co/api/v2/pokemon/1/encounters",
"moves": [78 items],
"name": "bulbasaur",
"order": 1,
"past_types": [],
"species": {2 items},
"sprites": {10 items},
"weight": 69,
"stats": [
{
"base_stat": 45,
"effort": 0,
"stat": {
"name": "hp",
"url": "https://pokeapi.co/api/v2/stat/1/"
}
},
{
"base_stat": 49,
"effort": 0,
"stat": {
"name": "attack",
"url": "https://pokeapi.co/api/v2/stat/2/"
}
},
.
....
}
我能够记录 name
、weight
和 height
等值,但无法获取值 stats
内的项目作为数组。我还需要嵌套在 stats
中的 stat
(name
和 url
)。
这是我所做的。
这是我的模型 类.
public class PokeDetail {
private String name;
private String height;
private String weight;
@SerializedName("stats")
@Expose
private List<PokeStats> stats = null;
public List<PokeStats> getStats() {
return stats;
}
public void setStats(List<PokeStats> stats) {
this.stats = stats;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
}
public class PokeStats {
private String effort;
public String getEffort() {
return effort;
}
public void setEffort(String effort) {
this.effort = effort;
}
}
这是我的 MainActivity 的样子:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://pokeapi.co/api/v2/")
.addConverterFactory(GsonConverterFactory.create())
.build();
PokeApiService pokeApiService = retrofit.create(PokeApiService.class);
Call<PokeDetail> call = pokeApiService.getPokeDetails(pokeNum);
call.enqueue(new Callback<PokeDetail>() {
@Override
public void onResponse(Call<PokeDetail> call, Response<PokeDetail> response) {
if(!response.isSuccessful()){
Log.i("ERROR", "onResponse: " + response.code());
}
PokeDetail pokeDetails = response.body();
Log.i("NAME", pokeDetails.getName());
Log.i("Height", pokeDetails.getHeight());
Log.i("Weight", pokeDetails.getWeight());
List<PokeStats> p = pokeDetails.getStats();
Log.i("ListDATA", p.toString());
}
@Override
public void onFailure(Call<PokeDetail> call, Throwable t) {
Log.i("ERROR", t.getMessage());
}
});
这是我的输出:
Log not proper Issue
你看到的是 toString
的默认版本,如果你想以你的方式登录然后覆盖它。请参阅下面的示例 class。
I need stat (name and url) which is nested inside stat
您的 PokeStats
class 中需要有 stat
密钥。
示例:
public class PokeStats {
@SerializedName("base_stat")
@Expose
private Integer baseStat;
@SerializedName("effort")
@Expose
private Integer effort;
@SerializedName("stat")
@Expose
private Stat stat;
public Integer getBaseStat() {
return baseStat;
}
public void setBaseStat(Integer baseStat) {
this.baseStat = baseStat;
}
public Integer getEffort() {
return effort;
}
public void setEffort(Integer effort) {
this.effort = effort;
}
public Stat getStat() {
return stat;
}
public void setStat(Stat stat) {
this.stat = stat;
}
@Override
public String toString() {
return "PokeStats{" +
"baseStat=" + baseStat +
", effort=" + effort +
", stat=" + stat.toString() +
'}';
}
}
& 嵌套 Stat
class:
public class Stat {
@SerializedName("name")
@Expose
private String name;
@SerializedName("url")
@Expose
private String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Stat{" +
"name='" + name + '\'' +
", url='" + url + '\'' +
'}';
}
}
建议:
如果您需要为此类错误响应制作 classes,您可以使用像这样的在线工具:https://www.jsonschema2pojo.org/
输入您的回复和选择 JSON
,GSON
相应的选项并生成 classes.