Преобразование списка json объектов в java объект с использованием gson, получает ноль - PullRequest
0 голосов
/ 14 марта 2020

Данные 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, но получили нулевое значение при пропуске всей строки или неправильно сформированную ошибку 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);

Но оба не работают.

Классы Java для StatesModel определены следующим образом.

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.

Ответы [ 2 ]

1 голос
/ 14 марта 2020

Ваш 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

0 голосов
/ 14 марта 2020

У вас есть два варианта. Вместо использования BufferReader вы можете использовать FileReader, как показано ниже. Используя FileReader, вы написали более чистый код, чем раньше.

  1. Преобразование 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);   
...