将2维字符串数组转换为Json

时间:2015-01-29 10:07:56

标签: java android json sharedpreferences

我是java和android编程的新手,我想将字符串数组转换为json。格式如下:

String[][] filters = new String[2][5];

for(int i=0; i<5; i++){
   filters[0][i] = "text";
}

for(int i=0; i<5; i++){
   filters[1][i] = "text";
}

我试过

JSONArray mJSONArray = new JSONArray(Arrays.asList(filters));

session.editor.putString("filters",mJSONArray.toString());
session.editor.commit();

然后我通过打印它来检查它

System.out.println(session.pref.getString("filters", null);) 

但输出就像这样

["[Ljava.lang.String;@41b91028","[Ljava.lang.String;@41b910a8"]

我想将它转换为json的原因是因为我想将它传递给SharedPreferences,这需要传递一个字符串。另外,我还想知道如何解码它。感谢。

3 个答案:

答案 0 :(得分:0)

这取决于您拥有JSONArray类的库。但是一般的方法应该是你创建一个空的JSONArray(例如让它调用它parentJsonArray)然后,在循环你的二维数组元素时,你把其他的孩子{{1}进入JSONArray's。应该是这样的:

parentJsonArray

之后,您可以将 JsonArray parentJsonArray = new JsonArray(); // loop through your elements for (int i=0; i<2; i++){ JsonArray childJsonArray = new JsonArray(); for (int j =0; j<5; j++){ childJsonArray.add(filters[i][j]); } parentJsonArray.add(childJsonArray); } 作为parentJsonArray传递到String,并按常规方式获取简单SharedPreferences

答案 1 :(得分:0)

将String Array转换为jsonArray不是存储到SharedPreference的正确方法,因为无法进行反向。

所以我想建议将string [] []数组转换为Base64 String并将该字符串存储到共享首选项,然后您可以轻松地将该字符串转换为String [] []返回。

使用以下功能

private String convertTwoDimensionalStringArrayToString(String[][] s){
        ByteArrayOutputStream bo = null;
        ObjectOutputStream so = null;
        Base64OutputStream b64 = null;
        try {
            bo = new ByteArrayOutputStream();
            b64 = new Base64OutputStream(bo, Base64.DEFAULT);
            so = new ObjectOutputStream(b64);
            so.writeObject(s);
            return bo.toString("UTF-8");
        } catch (Exception e){
            e.printStackTrace();
        }finally {
            try{
                if (bo != null) { bo.close(); }
                if (b64 != null) { b64.close(); }
                if (so != null) { so.close(); }
            }catch (Exception ee){
                ee.printStackTrace();
            }

        }
        return null;
    }

    private String[][] convertStringToTwoDimensionalStringArray(String s) {
        ByteArrayInputStream bi = null;
        ObjectInputStream si = null;
        Base64InputStream b64 = null;
        try {
            byte b[] = s.getBytes("UTF-8");
            bi = new ByteArrayInputStream(b);
            b64 = new Base64InputStream(bi, Base64.DEFAULT);
            si = new ObjectInputStream(b64);
            return (String[][]) si.readObject();
        }catch (Exception e){
            e.printStackTrace();
        } finally {
            try{
                if (bi != null) { bi.close(); }
                if (b64 != null) { b64.close(); }
                if (si != null) { si.close(); }
            }catch (Exception ee){
                ee.printStackTrace();
            }

        }
        return null;
    }

如何使用?

session.editor.putString("filters",convertTwoDimensionalStringArrayToString(filters));
session.editor.commit();

回到String [] []?

System.out.println(convertStringToTwoDimensionalStringArray(session.pref.getString("filters", null)));

答案 2 :(得分:0)

你可以使用ObjectSerializer类(我已经找到了它,但不记得在哪里)。您可以将对象序列化为String,然后将其作为String值保存到SharedPreferences中。当您需要它时,只需将其反序列化为对象并使用它。 有例子:

    private void serializeTest() {
        final String[][] filters = new String[2][5];
        for(int i=0; i<5; i++){
            filters[0][i] = "text";
        }

        for(int i=0; i<5; i++){
            filters[1][i] = "text";
        }
        try {
            final String serialized = ObjectSerializer.serialize(filters);
            PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit().putString("KEY", serialized).apply();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void deserializeTest() {
        final String serialized = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getString("KEY", "");
        try {
            final String[][] filters = (String[][]) ObjectSerializer.deserialize(serialized);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

    }

这里的ObjectSerializer类源代码: http://pastebin.com/MgJbwYeP