使用 gson 将 json 对象列表转换为 java 对象,得到 null
Converting a list of json objects to java object using gson, gets null
我拥有的 Json 数据。
[
{
"code": "24",
"name": "Rajsathan",
"districts": [
{"code":"1",
"name":"Jodhpur"},
{"code":"2",
"name":"Nagore"}
]
}
]
正在从文件中读取数据作为输入流。
BufferedReader br = new BufferedReader(new InputStreamReader(in));
Gson gson = new Gson();
String temp = null;
String total = null;
try {
while((temp = br.readLine()) != null) {
total+=temp;
}
} catch (Exception e){
e.printStactTrace();
}
现在我尝试了许多不同的方法来将此数据转换为 java 对象,但是在传递完整的字符串 total 时得到空值,或者在从 streamreader 转换每个流时出现格式错误的 json 错误。
StatesModel data = gson.fromJson(total, StatesModel.class);
// as its a list of json
Type collectionType = new TypeToken<Collection<StatesModel>>(){}.getType();
Collection<StatesModel> json_data = gson.fromJson(total, collectionType);
但两者都不行。
statesModel 的 Java classes 定义如下。
public class StatesModel {
@SerializedName("code")
public String code;
@SerializedName("name")
public String name;
@SerializedName("districts")
public List<DistrictModel> districts;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<DistrictModel> getDistricts() {
return districts;
}
public void setDistricts(List<DistrictModel> districts) {
this.districts = districts;
}
}
和地区 class 模型正在。
public class DistrictModel {
@SerializedName("code")
public String code;
@SerializedName("name")
public String name;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
将此数据转换为可迭代java对象的正确方法是什么。
您的 JSON 以 [
开头,这意味着我们需要一个 StatesModel
的数组。这可以从这样的文件中读取:
Reader reader = new FileReader("path_to_my_json.json");
Gson gson = new Gson();
StatesModel[] statesModels = gson.fromJson(reader, StatesModel[].class);
// do something with the array
Stream.of(statesModels).forEach(System.out::println);
StatesModel
POJO:
public class StatesModel {
private String code;
private String name;
private List<DistrictModel> districts;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<DistrictModel> getDistricts() {
return districts;
}
public void setDistricts(List<DistrictModel> districts) {
this.districts = districts;
}
@Override
public String toString() {
return "StatesModel{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
", districts=" + districts +
'}';
}
}
DistrictModel
POJO:
public class DistrictModel {
private String code;
private String name;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "DistrictModel{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
'}';
}
}
可以在 github 上找到工作代码:https://github.com/Ernyoke/gson-tutorial
你有两个选择。您可以像下面那样使用 FileReader,而不是使用 BufferReader。通过使用 FileReader,您编写的代码比以前更清晰。
- 将 JSON 文件转换为 Java 对象
Gson gson = new Gson();
StatesModel StatesModel = gson.fromJson(new FileReader("C:\myfile.json"), StatesModel.class);
- 将JSON字符串转换为Java对象
Gson gson = new Gson();
String json = '{"code": "24", "name": "Rajsathan", "districts": [ {"code":"1", "name":"Jodhpur"}, {"code":"2", "name":"Nagore"}]}';
StatesModel StatesModel = gson.fromJson(json, StatesModel.class);
我拥有的 Json 数据。
[
{
"code": "24",
"name": "Rajsathan",
"districts": [
{"code":"1",
"name":"Jodhpur"},
{"code":"2",
"name":"Nagore"}
]
}
]
正在从文件中读取数据作为输入流。
BufferedReader br = new BufferedReader(new InputStreamReader(in));
Gson gson = new Gson();
String temp = null;
String total = null;
try {
while((temp = br.readLine()) != null) {
total+=temp;
}
} catch (Exception e){
e.printStactTrace();
}
现在我尝试了许多不同的方法来将此数据转换为 java 对象,但是在传递完整的字符串 total 时得到空值,或者在从 streamreader 转换每个流时出现格式错误的 json 错误。
StatesModel data = gson.fromJson(total, StatesModel.class);
// as its a list of json
Type collectionType = new TypeToken<Collection<StatesModel>>(){}.getType();
Collection<StatesModel> json_data = gson.fromJson(total, collectionType);
但两者都不行。
statesModel 的 Java classes 定义如下。
public class StatesModel {
@SerializedName("code")
public String code;
@SerializedName("name")
public String name;
@SerializedName("districts")
public List<DistrictModel> districts;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<DistrictModel> getDistricts() {
return districts;
}
public void setDistricts(List<DistrictModel> districts) {
this.districts = districts;
}
}
和地区 class 模型正在。
public class DistrictModel {
@SerializedName("code")
public String code;
@SerializedName("name")
public String name;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
将此数据转换为可迭代java对象的正确方法是什么。
您的 JSON 以 [
开头,这意味着我们需要一个 StatesModel
的数组。这可以从这样的文件中读取:
Reader reader = new FileReader("path_to_my_json.json");
Gson gson = new Gson();
StatesModel[] statesModels = gson.fromJson(reader, StatesModel[].class);
// do something with the array
Stream.of(statesModels).forEach(System.out::println);
StatesModel
POJO:
public class StatesModel {
private String code;
private String name;
private List<DistrictModel> districts;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<DistrictModel> getDistricts() {
return districts;
}
public void setDistricts(List<DistrictModel> districts) {
this.districts = districts;
}
@Override
public String toString() {
return "StatesModel{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
", districts=" + districts +
'}';
}
}
DistrictModel
POJO:
public class DistrictModel {
private String code;
private String name;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "DistrictModel{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
'}';
}
}
可以在 github 上找到工作代码:https://github.com/Ernyoke/gson-tutorial
你有两个选择。您可以像下面那样使用 FileReader,而不是使用 BufferReader。通过使用 FileReader,您编写的代码比以前更清晰。
- 将 JSON 文件转换为 Java 对象
Gson gson = new Gson();
StatesModel StatesModel = gson.fromJson(new FileReader("C:\myfile.json"), StatesModel.class);
- 将JSON字符串转换为Java对象
Gson gson = new Gson();
String json = '{"code": "24", "name": "Rajsathan", "districts": [ {"code":"1", "name":"Jodhpur"}, {"code":"2", "name":"Nagore"}]}';
StatesModel StatesModel = gson.fromJson(json, StatesModel.class);