我从用户定义对象的正常数组创建了一个JSON数组。我如何将JSONArray转换回用户定义类型的正常数组..? 我在android中使用Json作为共享首选项。使用我在网上找到的代码:
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首选项中,然后尝试检索它。遇到问题,知道如何检索它。 感谢。
答案 0 :(得分:1)
如果您正在使用Android附带的JSONObject,那么将用户定义的类型转换为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 = 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");
}
}
处理数组非常相似。如下所示:
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 );
答案 1 :(得分:0)
我过去曾使用Google的gson库来执行此操作。看这里: http://code.google.com/p/google-gson/
答案 2 :(得分:0)
我假设您的JSON数组包含多个相同基本类型的实例(字符串,整数,浮点数等 - 如果没有,那么您将遇到问题)。
在这种情况下你需要做这样的事情(假设一个字符串数组):
String[] strArray = new String[jsonArray.length()];
for (int i = 0; i < jsonArray.length(); i++) {
strArray[i] = jsonArray.getString(i);
}
显然,如果您正在处理其他原始类型,请进行适当的替换。