2011-12-31 45 views
5

Tôi đã tạo một mảng JSON từ một mảng bình thường của đối tượng do người dùng xác định. Làm cách nào để chuyển đổi JSONArray trở lại thành mảng bình thường của kiểu người dùng định nghĩa ..? Tôi đang sử dụng Json cho sở thích được chia sẻ trong android.Using mã này tôi tìm thấy trên mạng:Chuyển đổi JSONArray thành Mảng bình thường

import org.json.JSONObject; 
import org.json.JSONArray; 
import org.json.JSONException; 

import android.content.Context; 
import android.content.SharedPreferences; 

public class JSONSharedPreferences { 
    private static final String PREFIX = "json"; 

    public static void saveJSONObject(Context c, String prefName, String key, JSONObject object) { 
     SharedPreferences settings = c.getSharedPreferences(prefName, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putString(JSONSharedPreferences.PREFIX+key, object.toString()); 
     editor.commit(); 
    } 

    public static void saveJSONArray(Context c, String prefName, String key, JSONArray array) { 
     SharedPreferences settings = c.getSharedPreferences(prefName, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putString(JSONSharedPreferences.PREFIX+key, array.toString()); 
     editor.commit(); 
    } 

    public static JSONObject loadJSONObject(Context c, String prefName, String key) throws JSONException { 
     SharedPreferences settings = c.getSharedPreferences(prefName, 0); 
     return new JSONObject(settings.getString(JSONSharedPreferences.PREFIX+key, "{}")); 
    } 

    public static JSONArray loadJSONArray(Context c, String prefName, String key) throws JSONException { 
     SharedPreferences settings = c.getSharedPreferences(prefName, 0); 
     return new JSONArray(settings.getString(JSONSharedPreferences.PREFIX+key, "[]")); 
    } 

    public static void remove(Context c, String prefName, String key) { 
     SharedPreferences settings = c.getSharedPreferences(prefName, 0); 
     if (settings.contains(JSONSharedPreferences.PREFIX+key)) { 
      SharedPreferences.Editor editor = settings.edit(); 
      editor.remove(JSONSharedPreferences.PREFIX+key); 
      editor.commit(); 
     } 
    } 
} 

Tôi đang cố gắng để chuyển đổi người dùng định nghĩa mảng đối tượng vào jsonarray và lưu trữ nó trong sở thích jsonshared và sau đó cố gắng để giải quyết vấn đề đó. Cảm ơn.

+1

thư viện JSon nào bạn đang sử dụng? Những chi tiết đó sẽ hữu ích khi trả lời câu hỏi của bạn một cách nhanh chóng. – kosa

+0

Đã chỉnh sửa chi tiết. – shady2020

Trả lời

0

Nếu bạn đang sử dụng JSONObject đi kèm với Android, tẻ nhạt của nó sẽ chuyển đổi từ các loại do người dùng xác định thành JSONObject/JSONArray rồi quay lại. Có các thư viện khác ngoài đó sẽ tự động thực hiện phép chuyển đổi này vì vậy nó đơn giản một hoặc hai dòng để giải mã/mã hóa JSON.

ProductLineItem lineItem = ...; 
JSONObject json = new JSONObject(); 
json.put("name", lineItem.getName()); 
json.put("quantity", lineItem.getCount()); 
json.put("price", lineItem.getPrice()); 
... // do this for each property in your user defined class 
String jsonStr = json.toString(); 

Điều này tất cả có thể được đóng gói trong ProductLineItem.toJSON(). Phân tích cú pháp là tương tự. Tôi muốn tạo ra một constructor mà phải mất một JSONObject và tạo ra các đối tượng như: ProductLineItem obj = new ProductLineItem (JSONObject):

public class ProductLineItem { 
    private String name; 
    private int quantity; 
    private float price; 

    public MyObject(JSONObject json) { 
     name = json.getString("name"); 
     count = json.getInt("quantity"); 
     price = json.optFloat("price"); 
    } 
} 

Xử lý mảng là rất nhiều như nhau. Vì vậy, một cái gì đó như:

public class ShoppingCart { 

    float totalPrice; 
    List<Rebate> rebates = new ArrayList<Rebate>(); 
    List<ProductLineItem> lineItems = new ArrayList<ProductLineItem>(); 


    public ShoppingCart(JSONObject json) { 
     totalPrice = json.getFloat("totalPrice"); 

     for(JSONObject rebateJson : json.getArray("rebates")) { 
      rebates.add(new Rebate(rebateJson)); 
     } 

     for(JSONObject productJson : json.getArray("lineItems")) { 
      lineItems.add(new ProductLineItem(productJson)); 
     } 
    } 

    public JSONObject toJSON() { 
     JSONObject json = new JSONObject(); 
     json.put("totalPrice", totalPrice); 

     JSONArray rebatesArray = new JSONArray(); 
     for(Rebate rebate : rebates) { 
      rebatesArray.put(rebate.toJSON()); 
     } 

     JSONArray lineItemsArray = new JSONArray(); 
     for(ProductLineItem lineItem : lineItems) { 
      lineItemsArray.put(lineItem.toJSON()); 
     } 

     json.put("rebates", rebatesArray); 
     json.put("lineItems", lineItemsArray); 

     return json; 
    } 
} 

Bạn có thể thấy chỉ cho một đối tượng đơn giản 2 mã tấm nồi hơi này là khá đáng kể. Vì vậy, bạn có thể tiếp tục làm việc này hoặc bạn có thể sử dụng một thư viện để xử lý tất cả những điều này cho bạn:

http://flexjson.sourceforge.net

// serialize 
String json = new JSONSerializer().serialize(shoppingCart); 
// deserialize 
ShoppingCart cart = new JSONDeserializer<ShoppingCart>().deserialize(json, ShoppingCart.class); 
+0

Điều này trả lời câu hỏi của tôi là tốt nhất. Tôi đã đi với chỉ sử dụng các tùy chọn chia sẻ bình thường cho mục đích của mình. Tôi đã muốn triển khai một hệ thống điểm số cao đơn giản. Tôi đã tìm ra điều này có thể được thực hiện để lưu trữ điểm số và chi tiết trong một chuỗi tùy chọn và sau đó phân tích cú pháp trong quá trình truy cập. – shady2020

+0

Bạn chắc chắn có thể viết các chuỗi json vào các sở thích được chia sẻ giống như bạn muốn sử dụng phương pháp này ở trên. Sử dụng JSON libs về bản chất là cùng một lượng mã như viết trực tiếp vào các prefs được chia sẻ. Nó vẫn còn gần giống với mã dịch thuật để dịch các đối tượng của bạn từ mô hình của bạn sang JSON hoặc các prefs được chia sẻ. – chubbsondubs

0

Tôi giả định mảng JSON của bạn chứa nhiều phiên bản cùng loại nguyên thủy (chuỗi, int, float, v.v. - nếu không thì bạn sẽ gặp sự cố).

Trong trường hợp này bạn cần phải làm điều gì đó như thế này (giả sử một mảng của chuỗi):

String[] strArray = new String[jsonArray.length()]; 

for (int i = 0; i < jsonArray.length(); i++) { 
    strArray[i] = jsonArray.getString(i); 
} 

Rõ ràng nếu bạn đang đối phó với các kiểu dữ liệu khác làm cho thay thế thích hợp.

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