Как добавить новый массив в файл JSON, хранящийся в Android - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть один файл 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 голосов
/ 25 ноября 2018

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());
}
0 голосов
/ 25 ноября 2018

Указанная выше структура неверна, вы не можете определить два узла с одинаковым именем user в JSONObject.

Если вы хотите сохранить список пользователей в файле, вы можете сохранитьэто как:

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

Кстати, почему бы не использовать базу данных SQLite?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...