【问题标题】:How to save array list of custom objects using gson如何使用 gson 保存自定义对象的数组列表
【发布时间】:2020-07-28 14:51:11
【问题描述】:

我有一个名为“user”的类,它有一个属性是一个名为“jobs”的自定义类的列表,我将用户转换为 json 并保存在文件系统中,现在我的问题是我使用 Gson 的作业保存它,但我有那个错误:

java.lang.IllegalStateException:应为 BEGIN_ARRAY,但为 BEGIN_OBJECT

这是用户类,我使用 userToJson 方法将其转换为 json,并使用带有 json 对象的构造函数对其进行反序列化

public class User implements Serializable {
private String FirstName;
private String LastName;
private String Email;
private String Phone;
private String Town;
private ArrayList<Job> Jobs;
private Location location;
private Boolean hasBusiness;

public User(){
    Jobs = new ArrayList<>();
}
public User(JSONObject userJson) throws JSONException {
    FirstName = userJson.getString(Constants.FILE_FIRST_NAME);
    LastName = userJson.getString(Constants.FILE_LAST_NAME);
    Email = userJson.getString(Constants.FILE_EMAIL);
    Phone = userJson.getString(Constants.FILE_PHONE);
    Town = userJson.getString(Constants.FILE_TOWN);
    String locationJSON = userJson.getString(Constants.FILE_LOCATION);
    location = new Gson().fromJson(locationJSON,Location.class);
    hasBusiness = userJson.getBoolean(Constants.FILE_HAS_BUSINESS);

    Type type = new TypeToken<List<Job>>(){}.getType();
    String jobJson= userJson.get(Constants.FILE_JOBS).toString();
    Jobs = new Gson().fromJson(jobJson,type);


}

public String getFirstName() {
    return FirstName;
}

public void setFirstName(String firstName) {
    FirstName = firstName;
}

public String getLastName() {
    return LastName;
}

public void setLastName(String lastName) {
    LastName = lastName;
}

public String getEmail() {
    return Email;
}

public void setEmail(String email) {
    Email = email;
}

public String getPhone() {
    return Phone;
}

public void setPhone(String phone) {
    Phone = phone;
}

public String getTown() {
    return Town;
}

public void setTown(String town) {
    Town = town;
}

public Location getLocation() {
    return location;
}

public void setLocation(Location location) {
    this.location = location;
}

public void setHasBusiness(Boolean hasBusiness) {
    this.hasBusiness = hasBusiness;
}

public Boolean getHasBusiness() {
    return hasBusiness;
}

public ArrayList<Job> getJobs() {
    return Jobs;
}

public void setJobs(ArrayList<Job> jobs) {
    Jobs = jobs;
}

public JSONObject userToJson() throws JSONException{
    JSONObject jo = new JSONObject();
    jo.put(Constants.FILE_FIRST_NAME,this.FirstName);
    jo.put(Constants.FILE_LAST_NAME,this.LastName);
    jo.put(Constants.FILE_TOWN,this.Town);
    jo.put(Constants.FILE_PHONE,this.Phone);
    jo.put(Constants.FILE_EMAIL,this.Email);
    jo.put(Constants.FILE_LOCATION,new Gson().toJson(location));
    jo.put(Constants.FILE_HAS_BUSINESS,hasBusiness);
    JSONArray jsonArray = new JSONArray();
    for(Job j : this.Jobs){
        jsonArray.put(j);
    }
    Log.d("JobsJobs",new Gson().toJson(jsonArray));
    jo.put(Constants.FILE_JOBS,new Gson().toJson(jsonArray));
    return jo;
}

}

现在作业字符串如下(它是空的),但它是关于我认为的结构

{"值":[]}

【问题讨论】:

    标签: android json


    【解决方案1】:

    这是因为您在 json 对象中获取作业列表,在变量 values

    因此,要获得作业列表,您需要按如下方式修改代码

    Jobs = new Gson().fromJson(jobJson,type).getJSONArray("values");

    【讨论】:

    • getJSONArray 不存在 :D 但我明白了,谢谢
    • 是的,我的错,Jsons 有多个库和处理方法,一些试验错误的东西
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多