如何使用 Retrofit 解析嵌套/多个 Json 对象
How to Parse Nested / Multiple Json Objects using Retrofit
我正在解析的 JSON 看起来像这样:
{ "version": 1
"data": {
"1001": {
"id": 1001,
"name": "herp",
"into": [
"3111": "we"
]
},
"1032": {
"id": 1002,
"name": "derp",
"into": [
"36": "w",
"12341: "c"
],
"tags": [
"hi there"
],
"cost" {
"even": 15
}
},
"1603": {
"id": 1003,
"name": "her",
"into": [
"37": "dll",
"58": "eow",
"32145": "3a"
],
"cost" {
"highest": 325
"lowest": 100
}
},
.... Even more data
}
"data" 内的 Json 持续了一段时间,没有设置终点。我无法控制 Json,我只是想阅读它。不幸的是,我的 class 代码无法正常工作。当我进行改造调用时,"data" 中的信息是空的。
我已经尝试了很多迭代来实现它,包括使用反序列化器和重构我的 POJO 代码。这是我的数据的当前状态 class:
public class Data {
private Map<String, Item> itemData;
// Relevant Getters, Setters and Constructors //
}
对于我的项目 Class,主要问题是未设置 JSON 内容,它有时会发生变化。正如您在上面看到的,"into" 中的值会有所不同,有时项目中的内容也会发生变化,例如 "tags" 或 "cost":
public class Item {
private int id;
private String name;
private String group;
private String description;
private Map<String, String> into;
private List<String> tags;
private Map<String, Integer> cost;
// Relevant Getters, Setters and Constructors //
当我使用这段代码时,我的数据 class 是空的,我在日志中没有看到任何错误,所以我似乎无法弄清楚为什么 GSON 无法使用它。
如果您想了解我如何构建我的 RestClient,请看这里:
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(ROOT)
.setClient(new OkClient(new OkHttpClient()))
.setLogLevel(RestAdapter.LogLevel.FULL);
RestAdapter restAdapter = builder.build();
REST_CLIENT = restAdapter.create(DataApi.class);
我知道我的 Rest 查询有效,因为我可以获得 "version" 中的内容,但数据中的所有内容都是空的。
关于您的 Pojo 的一个快速想法:
不确定这是否有效。也许写一个自定义反序列化器。
public class YourResponse {
int version;
Data data;
class Data {
Subdata subData;
}
class Subdata {
private int id;
private String name;
private ArrayList<Into> into;
private ArrayList<String> tags;
//...
}
class Into {
// "3111": "we"
private String into;
}
}
我正式是一个愚蠢的擦洗人员,完全检查了最简单的修复方法,应该撤销我的帐户和开发者头衔。
这就是我应该做的:
public class ItemGroup {
private String version;
private Map<String,Item> data;
//...Man i'm so dumb...
}
作为未来的参考。之所以可行,是因为 JSON 的格式为 { { } { } { } }。这意味着你有 3 个对象的对象,而不是 { [ ] [ ] [ ] },它是一个列表的 3 个对象。我所做的是将 { { } { } { } } 视为 { { { } { } { } } }。这是不正确的。通过使用基本上是对集合的地图,我们能够用地图模仿 { { } { } { } }。
映射对象{ {键对对象} {键对对象} {键对对象} }
我正在解析的 JSON 看起来像这样:
{ "version": 1
"data": {
"1001": {
"id": 1001,
"name": "herp",
"into": [
"3111": "we"
]
},
"1032": {
"id": 1002,
"name": "derp",
"into": [
"36": "w",
"12341: "c"
],
"tags": [
"hi there"
],
"cost" {
"even": 15
}
},
"1603": {
"id": 1003,
"name": "her",
"into": [
"37": "dll",
"58": "eow",
"32145": "3a"
],
"cost" {
"highest": 325
"lowest": 100
}
},
.... Even more data
}
"data" 内的 Json 持续了一段时间,没有设置终点。我无法控制 Json,我只是想阅读它。不幸的是,我的 class 代码无法正常工作。当我进行改造调用时,"data" 中的信息是空的。
我已经尝试了很多迭代来实现它,包括使用反序列化器和重构我的 POJO 代码。这是我的数据的当前状态 class:
public class Data {
private Map<String, Item> itemData;
// Relevant Getters, Setters and Constructors //
}
对于我的项目 Class,主要问题是未设置 JSON 内容,它有时会发生变化。正如您在上面看到的,"into" 中的值会有所不同,有时项目中的内容也会发生变化,例如 "tags" 或 "cost":
public class Item {
private int id;
private String name;
private String group;
private String description;
private Map<String, String> into;
private List<String> tags;
private Map<String, Integer> cost;
// Relevant Getters, Setters and Constructors //
当我使用这段代码时,我的数据 class 是空的,我在日志中没有看到任何错误,所以我似乎无法弄清楚为什么 GSON 无法使用它。
如果您想了解我如何构建我的 RestClient,请看这里:
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(ROOT)
.setClient(new OkClient(new OkHttpClient()))
.setLogLevel(RestAdapter.LogLevel.FULL);
RestAdapter restAdapter = builder.build();
REST_CLIENT = restAdapter.create(DataApi.class);
我知道我的 Rest 查询有效,因为我可以获得 "version" 中的内容,但数据中的所有内容都是空的。
关于您的 Pojo 的一个快速想法: 不确定这是否有效。也许写一个自定义反序列化器。
public class YourResponse {
int version;
Data data;
class Data {
Subdata subData;
}
class Subdata {
private int id;
private String name;
private ArrayList<Into> into;
private ArrayList<String> tags;
//...
}
class Into {
// "3111": "we"
private String into;
}
}
我正式是一个愚蠢的擦洗人员,完全检查了最简单的修复方法,应该撤销我的帐户和开发者头衔。
这就是我应该做的:
public class ItemGroup {
private String version;
private Map<String,Item> data;
//...Man i'm so dumb...
}
作为未来的参考。之所以可行,是因为 JSON 的格式为 { { } { } { } }。这意味着你有 3 个对象的对象,而不是 { [ ] [ ] [ ] },它是一个列表的 3 个对象。我所做的是将 { { } { } { } } 视为 { { { } { } { } } }。这是不正确的。通过使用基本上是对集合的地图,我们能够用地图模仿 { { } { } { } }。
映射对象{ {键对对象} {键对对象} {键对对象} }