GsonFromJson: как сериализовать и де сериализовать со структурами массива - PullRequest
0 голосов
/ 21 октября 2018

Я работаю над проектом, в котором мы использовали jsonfile в качестве базы данных, поскольку SQLite не отвечает требованиям.У проекта есть часть, когда объект из банка слов используется, он изменит статус (например, 1-4).Я использовал JSONArray для доступа к данным.Когда я пытался изменить / отредактировать статус, он не сохраняет и не записывает обратно в jsonfile.Вместо этого он работает только при кратковременном использовании приложения.

Из поисков появляется множество вещей, использующих gson.Я решил использовать gson.

Я новичок в gson и только начал изучать его на днях.И у меня проблемы с этим.

Это структура моего jsonfile.У него есть 2 объекта (пользователи и банк слов), которые расположены в массиве

{ 
"users" :
  [{
    "username": "free",
    "password": "free",
    "email": "free@gmail.com",
    "type": "1"
  },
  {
    "username": "premium",
    "password": "premium",
    "email": "premium@gmail.com",
    "type": "2"
  }],
"wordbank" : 
  [{
      "English": "able",
      "Cebuano": "kaya",
      "Pronunciation": "ká-ya",
      "POS": "adjective",
      "Audio": "kaya.mp3",
      "Status": "0"
  },
  {
      "English": "advice",
      "Cebuano": "tambag",
      "Pronunciation": "tam-bag",
      "POS": "noun",
      "Audio": "tambag.mp3",
      "Status": "0"
  }]
}

Из того, что я видел в обучающих видео, вы создаете другой класс Java для своей модели.Итак, я создаю 3 класса Java.user, wordbank и словарь (объединяя их оба).

public class dictionary{
  users[] user;
  wordbanks[] word;
}

Я уже использую существующий jsonfile, поэтому я проанализировал его и получил его jsonstring.После чего я попытался десериализовать его, используя

jsonstring = readFromFile();//returns string from jsonfile
dictionary list = new Gson().fromJson(jsonstring, dictionary.class);

, запустил его и отладил.но когда я получил результаты.это было ноль.

ВОПРОСЫ: 1. Смогу ли я редактировать и сохранять изменения в файле json с помощью gson?2. Правильна ли моя структура для класса по выбору?3. как его сериализовать и десериализовать?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Да, вы можете использовать Gson для всех ваших требований.Сначала создайте соответствующий Pojo для вашей структуры JSON.Вы можете использовать такие инструменты, как этот генератор pojo .Просто вставьте туда json (не выбирайте схему json) и сгенерируйте.Предполагая, что у вас есть три класса Result (содержит списки, аналогичные вашему словарному классу), User и Wordbank класс.Вы можете читать (десериализовать) и записывать (сериализовать) обратно в файл следующим образом.

try {
    // deserialize
    Result result = gson.fromJson(new FileReader(new File("src/test/resources/sample.json")), Result.class);
    // ... update result as required
    // result.users.remove(0);
    // serialize
    String json = gson.toJson(result);
    Files.write(new File("src/test/resources/sample.json").toPath(), json.getBytes());
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}
0 голосов
/ 21 октября 2018
  • Если ваши переменные-члены классов pojo (пользователи, рабочий банк, словарь) не совпадают с ключом JSON, рассмотрите возможность использования @SerializedName, предоставленного GSON.В вашем случае я смог десериализовать строку, используя gson, используя @SerializedName, как показано ниже

Класс пользователя

 public class User {

       @SerializedName("username")
    private String userName;
    @SerializedName("password")
    private String password;
    @SerializedName("email")
    private String email;
    @SerializedName("type")
    private String type;

    // Add Getters and Setters
}

Класс WordBank

public class Wordbank {

    @SerializedName("English")
    private String english;
    @SerializedName("Cebuano")
    private String cebuano;
    @SerializedName("Pronunciation")
    private String pronunciation;
    @SerializedName("POS")
    private String pos;
    @SerializedName("Audio")
    private String audio;
    @SerializedName("Status")
    private String status;

    // Add getters and Setters
}

Словарь класса

    public class Dictonary {

    @SerializedName("users")
    User[] userArray;
    @SerializedName("wordbank")
    Wordbank[] wordbankArray;

    public User[] getUserArray() {
        return userArray;
    }

    public void setUserArray(User[] userArray) {
        this.userArray = userArray;
    }

    public Wordbank[] getWordbankArray() {
        return wordbankArray;
    }

    public void setWordbankArray(Wordbank[] wordbankArray) {
        this.wordbankArray = wordbankArray;
    }
}

После внесения необходимых изменений, как описано выше, я смог десериализовать строку

 Dictonary dictonary =  new Gson().fromJson(input,Dictonary.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...