如何在存储在Android中的JSON文件中追加新数组

时间:2018-11-25 07:22:03

标签: android json android-studio

我的应用程序数据文件夹中有一个JSON文件。

 {
  "user": [
    {
      "identifier": "1",
      "name": "xyz",
      "contact": [
        {
          "contact": "123"
        },
        {
          "contact": "456"
        }
      ]
    }
  ]
}

现在,我想像这样在运行时添加一个新用户。

{
  "user": [
    {
      "identifier": "1",
      "name": "xyz",
      "contact": [
        {
          "contact": "123"
        },
        {
          "contact": "456"
        }
      ]
    }
  ],
  "user": [
    {
      "identifier": "2",
      "name": "abc",
      "contact": [
        {
          "contact": "445"
        },
        {
          "contact": "789"
        }
      ]
    }
  ]
}

为此,我有这段代码,但是它只是覆盖了现有用户。

String lastObject = getStringFronFile(new FileInputStream(file));
        try {
            JSONObject prevJSONObj = new JSONObject(lastObject);
            prevJSONObj.put("sticker_packs",newUserArray);
            writeJsonFile(file,prevJSONObj);
        }
        catch (Exception e) {
            Log.d("Json Error", e.toString());
        }

writeJsonFile是一种写入文件的方法。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

您上面定义的结构是错误的,您不能在JSONObject中定义两个具有相同名称user的节点。

如果要将用户列表存储到文件中,可以将其存储为:

[
    {
        "name":"Jack",
        "age" :20
    },
    {
        "name":"Tom",
        "age" :20
    }
]

顺便说一句,为什么不使用SQLite数据库?

答案 1 :(得分:0)

Gson简化了这项工作。添加gson依赖项https://github.com/google/gson或改造的gson(两者相同) implementation 'com.squareup.retrofit2:converter-gson:2.4.0'。根据您的详细信息,构建了以下pojo类:

public class Example {
@SerializedName("user")
@Expose
private List<User> user = null;

public List<User> getUser() {
return user;
}

public void setUser(List<User> user) {
this.user = user;
}
}

public class User {
@SerializedName("identifier")
@Expose
private String identifier;
@SerializedName("name")
@Expose
private String name;
@SerializedName("contact")
@Expose
private List<Contact> contact = null;

public String getIdentifier() {
return identifier;
}

public void setIdentifier(String identifier) {
this.identifier = identifier;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<Contact> getContact() {
return contact;
}

public void setContact(List<Contact> contact) {
this.contact = contact;
}
}

public class Contact {
@SerializedName("contact")
@Expose
private String contact;

public String getContact() {
return contact;
}

public void setContact(String contact) {
this.contact = contact;
}
}

您可以使用以下代码段从字符串中获取详细信息,并附加动态数据并更新文件。

String lastObject = getStringFromFile(new FileInputStream(file));
Example newJsonToReplace = new Example();
List<User> usersList = new ArrayList();
try{
    Type typeOfObject = new TypeToken<Example>() {
    }.getType(); // type you will be getting from string
    Example example = new Gson().fromJson(lastObject, typeOfObject); // converting string to pojo using gson
    if(example != null){
        usersList.addAll(example.getUser());
    }
    usersList.add(yourYourToAdd); // add your user object
    newJsonToReplace.setUser(usersList);
    String updatedList = new Gson().toJson(newJsonToReplace, typeOfObject); // again converting to json to string
    writeJsonFile(updatedList); // will replace the existing content
}catch(Exception exception){
    Log.d("Json Error", e.toString());
}