2010-12-12 12 views
5

Estoy creando una aplicación para Android que crea un archivo de texto con objetos JSON y lo escribe en el almacenamiento interno. Tengo el siguiente código para hacer esto:Android Internal Storage, cómo analizar correctamente un archivo de texto 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(); 
} 

ahora tengo un archivo de texto que se ve así:

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

me gustaría recoger ahora que los datos en el archivo JSON. La aplicación necesita escribir, almacenar y recuperar el JSON. El problema es cuando voy a analizar los objetos JSON del archivo usando:

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"; 
} 

Se lanza un error. Obtuve el código de análisis de un gran tutorial en: http://www.ibm.com/developerworks/web/library/x-andbene1/?ca=drs-#author1 En ese ejemplo, el código está esperando corchetes alrededor de todo el archivo y sin coma después del último objeto. Entonces necesitaría:

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

Pero escribo esas líneas JSON una a la vez en mi código; ¿Cómo puedo manipular el archivo de texto JSON para obtenerlo en el formato esperado?

ACTUALIZACIÓN:

El problema sigue siendo que si el usuario escribe la matriz JSON para el archivo y luego regresa y cambia de nuevo, se obtiene dos arrays JSON en ese archivo. De este modo:

[ 
    { 
      "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" 
    } 
] 

¿Cómo puedo leer la primera matriz, añadir el segundo y luego volver a escribir el archivo con ambas matrices fusionado en una sola?

Respuesta

0
  1. hacer de esto una matriz JSON válida, es necesario encapsular los objetos JSON-({...}) entre llaves ([]). Por lo tanto, se puede poner [ en el archivo de creación y

    • o bien tienen un único punto en que se terminó la matriz y que acaba de escribir una llave de cierre ] lugar de la próxima coma (,), o
    • usted no tiene un punto tan único. Cada vez que se escribe el siguiente objeto, es posible que pueda volver un byte en el flujo a través de 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. (en relación con la "UPDATE"): Basta con leer toda la gama de los autos, actualizarlo en la memoria (a través de JSONArray.put()) y sobrescribir el archivo.

    Para sobrescribir, reemplace Context.MODE_APPEND con 0, como está escrito en the API.

    Sería mejor si creó la matriz correctamente. Si se le proporcionan las matrices como en su actualización, puede buscar la ocurrencia de ][, dividir su archivo en eso, crear el JSON de ambos objetos y fusionarlos (una vez más, a través de JSONArray.put()).