将JSONArray转换为普通数组

5

我从一个普通的用户定义对象数组创建了一个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并将其存储在JsonSharedPreference中,然后尝试检索它。但是不知道如何检索它。谢谢。


1
你使用哪个JSON库?这些细节将有助于快速回答你的问题。 - kosa
3个回答

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

这是最好的答案,解决了我的问题。虽然我只是为了我的目的使用普通的共享首选项。我想实现一个简单的高分系统。我认为可以将得分和详细信息存储在共享首选项中的单个字符串中,然后在检索期间对其进行解析。 - shady2020
你可以使用上述方法将JSON字符串写入共享首选项,就像你希望的那样。使用JSON库基本上与直接编写共享首选项的代码量相同。从模型到JSON或共享首选项的转换代码仍然大致相同。 - chubbsondubs

0

0

我假设你的JSON数组包含多个相同的基本类型(字符串、整数、浮点数等——如果不是这样,那么你将会遇到问题)。

在这种情况下,你需要像这样做(假设一个字符串数组):

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

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

显然,如果你正在处理其他原始类型,请进行适当的替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接