2010-12-12 41 views
5

Tôi đang tạo ứng dụng Android tạo tệp văn bản có các đối tượng JSON và ghi nó vào bộ nhớ trong. Tôi có đoạn code sau đây để làm điều đó:Bộ nhớ trong của Android, cách phân tích cú pháp đúng cách tệp văn bản 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(); 
} 

Bây giờ tôi nhận được một file văn bản trông giống như vậy:

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

Tôi muốn đến nay thu thập dữ liệu trong file JSON. Ứng dụng cần viết, lưu trữ và truy xuất JSON. Vấn đề là khi tôi đi phân tích cú pháp các đối tượng JSON từ tệp bằng cách sử dụng:

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

Nó phát sinh lỗi. Tôi nhận được mã phân tích cú pháp từ một hướng dẫn tuyệt vời tại: http://www.ibm.com/developerworks/web/library/x-andbene1/?ca=drs-#author1 Trong ví dụ đó, mã đang chờ dấu ngoặc xung quanh toàn bộ tệp và không có dấu phẩy nào sau đối tượng cuối cùng. Vì vậy, tôi sẽ cần:

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

Nhưng tôi viết những dòng JSON đó một lần vào mã của tôi; Làm cách nào tôi có thể thao tác tệp văn bản JSON để tải tệp theo định dạng mong muốn?

UPDATE:

Vấn đề vẫn là nếu người dùng viết các mảng JSON để các tập tin và sau đó trở lại và thay đổi nó một lần nữa, bạn sẽ có được hai mảng JSON trong tập tin đó. Giống như vậy:

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

Làm thế nào tôi có thể đọc mảng đầu tiên, thêm thứ hai và sau đó viết lại tệp với cả hai mảng được hợp nhất thành một?

Trả lời

3

Bạn cần sử dụng JSONArray để tạo mảng JSON objects. Khi bạn thực hiện một toString(), bạn sẽ có các dấu ngoặc mong đợi. Bạn không cần phải thêm dấu phẩy theo cách thủ công.

Hãy xem http://developer.android.com/reference/org/json/JSONArray.html để biết thêm

+0

Vui lòng xem cập nhật – Chris

0
  1. để làm điều này một mảng JSON hợp lệ, bạn cần để đóng gói các JSON-Objects ({...}) trong niềng răng ([]). Vì vậy, bạn có thể đặt [ vào tập tin trên sáng tạo và

    • hoặc có một điểm duy nhất nơi các mảng kết thúc và bạn chỉ cần viết một cú đúp đóng ] thay vì dấu phẩy sau (,), hoặc
    • bạn không có một điểm duy nhất. Bất cứ khi nào bạn viết đối tượng kế tiếp, bạn có thể quay trở lại một byte trong dòng qua 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. (liên quan đến "UPDATE"): Chỉ cần đọc toàn bộ mảng từ các tập tin, cập nhật nó trong bộ nhớ (thông qua JSONArray.put()) và ghi đè lên tệp.

    Để ghi đè, thay thế Context.MODE_APPEND bằng 0, như được viết trong the API.

    Sẽ tốt hơn nếu bạn tạo mảng chính xác. Nếu bạn được đưa ra các mảng như trong bản cập nhật, bạn có thể tìm kiếm sự xuất hiện của ][, chia nhỏ tệp của bạn trên đó, tạo JSON từ cả hai đối tượng và hợp nhất chúng (một lần nữa, thông qua JSONArray.put()).

Các vấn đề liên quan