【问题标题】:GsonFromJson: how to serialize and de serialize with array structuresGson FromJson:如何使用数组结构进行序列化和反序列化
【发布时间】:2018-10-21 06:06:56
【问题描述】:

我正在做一个项目,我们使用 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 类。用户、词库和字典(将它们结合起来)。

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.如何序列化和反序列化?

【问题讨论】:

    标签: java android json gson


    【解决方案1】:
    • 如果你的 pojo Classes(users,workdbank,dictionary) 的成员变量与 JSON 键不匹配,请考虑使用 GSON 提供的 @SerializedName。在您的情况下,我能够使用 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);
    

    【讨论】:

    • 这帮助我找到了答案。谢谢!
    【解决方案2】:

    是的,您可以使用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();
    }
    

    【讨论】:

    • new FileReader(new File("src/test/resources/sample.json")) 字符串还是 jsonfile?
    • 那个是json文件的路径,不是json字符串。 String json = gson.toJson(result); 语句将对象转换为 json 字符串,json 变量保存该 json 字符串,下一行将该字符串写入指定的文件
    猜你喜欢
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多