Android Internal Storage, как правильно разобрать текстовый файл JSON - PullRequest
6 голосов
/ 12 декабря 2010

Я создаю приложение для Android, которое создает текстовый файл с объектами JSON и записывает его во внутреннее хранилище.У меня есть следующий код для этого:

JSONObject myJSON = new JSONObject();
//Set the JSON object with website, length and Id (time-stamp)
try {
    myJSON.put("Length", trim)
    .put("Website", data)
    .put("Id", tx);
} catch (JSONException e1) {
    e1.printStackTrace();
}

//Convert JSON object to a string and add a comma
String myJSONString = myJSON.toString();
myJSONString += ", ";

try {
     FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_APPEND);
     fos.write(myJSONString.getBytes());
     fos.close();
     //Log.d(TAG, "Written to file");

} catch (Exception e) {
    Log.d(TAG, "cought");
    e.printStackTrace();
}

Теперь я получаю текстовый файл, который выглядит так:

{"Id":"20101211T155146","Length":10}, {"Id":"20101211T155155","Length":10},
{"Id":"20101211T155203","Length":10}, {"Id":"20101211T155252","Length":10}, 

Я хотел бы сейчас собрать эти данные в JSONфайл.Приложение должно писать, хранить и получать JSON.Проблема в том, что когда я иду, чтобы разобрать объекты JSON из файла, используя:

String x = "";
InputStream is = this.getResources().openRawResource(R.raw.pwh);
byte [] buffer = new byte[is.available()];
while (is.read(buffer) != -1);
String jsontext = new String(buffer);
JSONArray entries = new JSONArray(jsontext);

x = "JSON parsed.\nThere are [" + entries.length() + "]\n\n";

int i;
for (i=0;i<entries.length();i++)
{
    JSONObject post = entries.getJSONObject(i);
    x += "------------\n";
    x += "Id:" + post.getString("Id") + "\n";
    x += "Length:" + post.getString("Length") + "\n\n";
}

Выдает ошибку.Я получил код синтаксического анализа из большого учебника по адресу: http://www.ibm.com/developerworks/web/library/x-andbene1/?ca=drs-#author1 В этом примере код ожидает скобки вокруг всего файла и без запятой после последнего объекта.Поэтому мне нужно:

[{"Id":"20101211T155146","Length":10}, {"Id":"20101211T155155","Length":10},
{"Id":"20101211T155203","Length":10}, {"Id":"20101211T155252","Length":10}]

Но я пишу эти строки JSON по одному в моем коде;Как я могу манипулировать текстовым файлом JSON, чтобы получить его в ожидаемом формате?

ОБНОВЛЕНИЕ:

Проблема по-прежнему заключается в том, что если пользователь записывает массив JSON вфайл, а затем возвращается и изменяет его снова, вы получаете два массива JSON в этом файле.Вот так:

[
     {
          "phonenumber": "15555215554",
          "time": "20110113T173835",
          "username": "edit username",
          "email": " edit email",
          "password": "edit password"
     }
][
     {
          "phonenumber": "15555215554",
          "time": "20110113T173900",
          "username": "edit username",
          "email": " edit email",
          "password": "edit password"
     },
     {
          "phonenumber": "15555215554",
          "time": "20110113T173900",
          "username": "edit username",
          "email": " edit email",
          "password": "edit password"
     }
]

Как мне прочитать первый массив, добавить второй, а затем переписать файл, объединяя оба массива в один?

Ответы [ 2 ]

3 голосов
/ 12 декабря 2010

Вам необходимо использовать JSONArray для создания массива JSON objects. Как только вы выполните toString (), вы получите ожидаемые скобки. Вам также не нужно вручную добавлять запятые.

Посмотрите http://developer.android.com/reference/org/json/JSONArray.html для получения дополнительной информации

0 голосов
/ 25 августа 2015
  1. , чтобы сделать этот массив JSON допустимым, вам нужно заключить JSON-объекты ({...}) в фигурные скобки ([]). Таким образом, вы можете поместить [ в файл при создании и

    • либо имеет одну точку, где массив заканчивается, и вы просто пишете закрывающую скобку ] вместо следующей запятой (,), или
    • у вас нет такой единой точки. Всякий раз, когда вы пишете следующий объект, вы можете вернуться на один байт в потоке через f.ex.

      try {
          FileChannel ch = fos.getChannel();
          ch.position(ch.position -1);
          ch.write(", ".getBytes());
          ch.write(ByteBuffer.wrap(myJSONString.getBytes()));
          ch.write("]".getBytes());
      } finally {
          out.close();
      } 
      
  2. (относительно «ОБНОВЛЕНИЕ»): Просто прочитайте весь массив из файла, обновите его в памяти (через JSONArray.put () ) и перезапишите файл.

    Чтобы перезаписать, замените Context.MODE_APPEND на 0, как написано в API .

    Было бы лучше, если бы вы правильно создали массив. Если вам даны массивы, как в вашем обновлении, вы можете найти вхождение ][, разбить ваш файл на него, создать JSON из обоих объектов и объединить их (еще раз, через JSONArray.put ( ) ).

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