【问题标题】:Converting a list of json objects to java object using gson, gets null使用 gson 将 json 对象列表转换为 java 对象,得到 null
【发布时间】:2020-06-26 04:03:04
【问题描述】:

我拥有的 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 对象,但是在从 streamreader 转换每个流时传递完整的字符串总数或格式错误的 json 错误时得到 null。

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 类定义如下。

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;
    }

}

还有区类模型存在。

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;
    }

}

将这些数据转换为可迭代的 javaObjects 的正确方法是什么?

【问题讨论】:

  • 将对从文件读取的数据进行改造,我可以选择编辑 json 格式,因为数据存储在本地文件中。
  • 为了测试,在你使用 String str = "[{\"code\":\"24\",\"name\"... ";所以你不必担心文件。还要删除所有地区的东西,以使问题更小,更专注于(当前)json问题。

标签: java json gson pojo


【解决方案1】:

您的 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);

StatesModelPOJO:

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 +
                '}';
    }
}

DistrictModelPOJO:

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 读取文件会引发文件未找到错误,该文件位于资源文件夹中。但是我可以将其作为输入流读取,不会引发错误,我应该对其进行哪些编辑才能将其读取为输入流。
  • new FileReader("path_to_my_json.json"); - 您可以在此处传递任何绝对路径,它应该能够毫无问题地读取您的文件(只要文件是可读的并且我们拥有正确的权限)。
  • 我尝试通过提供相对路径或作为类加载器来读取文件,当作为流读取时,我可以获得数据但不能作为文件。它是一个 Maven 项目,该文件位于 src/main/resources 中。此外,此参考可能有助于更好地了解情况stackoverflow.com/a/23547760/7419457
【解决方案2】:

你有两个选择。您可以使用 FileReader,而不是使用 BufferReader,如下所示。通过使用 FileReader,您可以编写比以前更简洁的代码。

  1. 将 JSON 文件转换为 Java 对象
    Gson gson = new Gson();
    StatesModel StatesModel = gson.fromJson(new FileReader("C:\\myfile.json"), StatesModel.class);
  1. 将 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);   

【讨论】:

  • 请求您阅读下面 Ervin 的回答的评论主题。
  • 您说将文件作为 FileReader 读取会引发找不到文件的错误。这个问题不是来自你的 FileReader 类。所以再次检查你的文件路径。
猜你喜欢
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多