Android Internen Speicher, wie Sie richtig zu Parsen einer JSON-text-Datei
Ich bin erstellen einer Android-app, die erstellt eine text Datei mit dem JSON-Objekte und schreibt diese in den internen Speicher. Ich habe den folgenden code tun:
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();
}
Jetzt bekomme ich eine text-Datei, die sieht so aus:
{"Id":"20101211T155146","Length":10}, {"Id":"20101211T155155","Length":10},
{"Id":"20101211T155203","Length":10}, {"Id":"20101211T155252","Length":10},
Möchte ich jetzt sammeln, dass die Daten in der JSON-Datei. Die app muss schreiben, speichern und abrufen von JSON. Das problem ist wenn ich zum Parsen der JSON-Objekte aus der Datei mit:
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";
}
Wirft es einen Fehler. Ich habe die parsing-code von einem tollen tutorial an: http://www.ibm.com/developerworks/web/library/x-andbene1/?ca=drs-#author1
In diesem Beispiel ist der code erwartet die Klammern um die gesamte Datei und kein Komma nach dem letzten Objekt. Also ich würde brauchen:
[{"Id":"20101211T155146","Length":10}, {"Id":"20101211T155155","Length":10},
{"Id":"20101211T155203","Length":10}, {"Id":"20101211T155252","Length":10}]
Aber ich Schreibe diese JSON-Zeilen nacheinander in meinem code, Wie kann ich manipulieren, die JSON-text-Datei, um es in das erwartete format?
UPDATE:
Das problem ist noch, dass, wenn der Benutzer schreibt die JSON-array in die Datei und dann kommt wieder und ändert es wieder, Sie bekommen zwei JSON-arrays in dieser Datei. Etwa so:
[
{
"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"
}
]
Wie kann ich Lesen das erste array, fügen Sie die zweite und dann wieder die Datei schreiben mit beiden arrays, die zu einer verschmolzen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
JSONArray
zu erstellen, die ein array vonJSON objects
. Sobald Sie das tun eine toString(), haben Sie die erwarteten Klammern. Sie nicht brauchen, um manuell hinzufügen, die Kommas entweder.Werfen Sie einen Blick auf http://developer.android.com/reference/org/json/JSONArray.html für mehr info
machen dieses ein gültiges JSON-array, die Sie benötigen zu Kapseln, die JSON-Objekte (
{...}
) in Klammern ([]
). So könnte man[
in die Datei, die auf die Bildung und]
statt des nächsten Komma (,
), oderMach dir nicht so einen einzigen Punkt. Wann schreiben Sie das nächste Objekt, Sie könnten in der Lage sein, zurück zu gehen, ein byte in den stream über f.ex.
(über die "UPDATE"):
Lesen Sie einfach das gesamte array aus der Datei, aktualisieren Sie es in den Speicher (via JSONArray.put()), und die Datei überschreiben.
Überschreiben, ersetzen Sie die
Context.MODE_APPEND
mit 0, wie geschrieben die API.Wäre es besser, wenn Sie erstellt das array korrekt. Wenn Sie gegeben sind die arrays wie in deinem update, Sie könnte die Suche nach dem vorkommen von
][
teilen Sie Ihre Datei auf das erstellen der JSON-von beiden Objekten, und mischen Sie die (wieder einmal, über JSONArray.put()).