2011-12-31 9 views
5

Я создал массив JSON из обычного массива определенного пользователем объекта. Как преобразовать JSONArray в обычный массив определенного пользователем типа?? Я использую JSON для общего предпочтения в android.Using этого код я нашел в сети:Преобразование JSONArray в нормальный массив

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(); 
     } 
    } 
} 

Я пытаюсь преобразовать определенный пользователь массив объектов в jsonarray и хранить его в jsonshared предпочтения, а затем пытаюсь чтобы извлечь его. Имея проблему, зная, как ее извлечь. Спасибо.

+1

которые вы используете JSon? Эти детали помогут вам быстро ответить на ваш вопрос. – kosa

+0

Отредактировано с подробностями. – shady2020

ответ

0

Если вы используете JSONObject, который поставляется с Android, его утомительно конвертировать из пользовательских типов в JSONObject/JSONArray, а затем снова. Существуют и другие библиотеки, которые будут делать это преобразование автоматически, поэтому просто одна или две строки для декодирования/кодирования 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(); 

Все это может быть инкапсулировано в ProductLineItem.toJSON(). Анализ аналогичен. Я хотел бы создать конструктор, который принимает JSONObject и создает объект, как: ProductLineItem OBJ = новый 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"); 
    } 
} 

Обработка массивов очень много же. Так что-то вроде:

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

Вы можете увидеть только для простых 2 объектов этот код котловой плиты весьма значителен. Таким образом, вы можете продолжать делать это, или вы можете использовать библиотеку, которая обрабатывает все это для вас:

http://flexjson.sourceforge.net

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

Это ответ на мой вопрос наилучшим. Хотя я пошел с использованием обычных общих настроек для своих целей. Я хотел реализовать простую систему с высокими баллами. Я решил, что это можно сделать, сохраняя оценки и данные в одной строке в общей предпочтений, а затем разбора его во время восстановления. – shady2020

+0

Вы, безусловно, можете написать строки json в общие настройки, как вы хотели бы использовать этот метод выше. Использование JSON libs - это, по сути, такое же количество кода, что и для прямого доступа к общим привилегиям. Это по-прежнему примерно такой же код перевода, что и перевод ваших объектов с вашей модели на JSON или общие привилегии. – chubbsondubs

0

Я предполагаю, что ваш массив JSON содержит несколько экземпляров одного и того же примитивного типа (строка, int, float и т. Д. - если нет, то у вас будут проблемы).

В этом случае вам нужно сделать что-то вроде этого (предполагая, что массив строк):

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

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

Очевидно, что если вы имеете дело с другими примитивными типами сделать соответствующие замены.

Смежные вопросы