我正在创建一个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"
}
]
如何读取第一个数组,添加第二个数组,然后重新编写文件,将两个数组合并为一个?
答案 0 :(得分:3)
您需要使用JSONArray
创建一个JSON objects
数组。一旦你执行了toString(),你将拥有预期的括号。您无需手动添加逗号。
查看http://developer.android.com/reference/org/json/JSONArray.html了解更多信息
答案 1 :(得分:0)
要使其成为有效的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();
}
(关于“更新”): 只需从文件中读取整个数组,在内存中更新它(通过JSONArray.put()),然后覆盖该文件。
要覆盖,请将Context.MODE_APPEND
替换为0,如the API中所述。
如果正确创建数组会更好。如果您在更新中获得了数组,则可以搜索][
的出现位置,在其上分割文件,从两个对象创建JSON,然后合并(再次通过JSONArray.put() )。