GsonFromJson:如何使用数组结构进行序列化和反序列化

时间:2018-10-21 06:06:56

标签: java android json gson

由于SQLite不满足要求,因此我正在一个项目中使用jsonfile作为其数据库。当使用单词库中的某个对象时,项目中会有一部分会更改状态(例如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类。用户,单词库和字典(将它们结合在一起)。

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

我已经在使用现有的jsonfile,所以我解析了它并得到了它的jsonstring。之后,我尝试使用

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

运行并调试。但是当我得到结果时。它为空。

问题: 1.我可以使用gson编辑并保存json文件中的更改吗? 2.我的结构是否适合应修课程? 3.如何序列化和反序列化?

2 个答案:

答案 0 :(得分:0)

  • 如果pojo类的成员变量(用户,workdbank,字典)与JSON键不匹配,请考虑使用GSON提供的@SerializedName。在您的情况下,我可以通过使用@SerializedName如下所示使用gson对字符串进行反序列化

用户类别

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

答案 1 :(得分:0)

是的,您可以使用Gson满足所有要求。首先为您的json结构创建匹配的Pojo。您可以使用this pojo generator之类的工具。只需将json粘贴到那里(不要选择json模式)并生成即可。假设您有三个类Result(包含列表,类似于字典类),UserWordbank类。您可以按以下方式读取(反序列化)和写入(序列化)回文件。

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