【问题标题】:Converting 2 Dimensional String Array to Json将二维字符串数组转换为 Json
【发布时间】:2015-03-28 12:18:54
【问题描述】:

我是 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,这需要传递一个字符串。另外,我也想知道如何解码。谢谢。

【问题讨论】:

  • 什么是实际和预期的输出..??数组的输入是什么
  • 嗨,我编辑了这个问题。 @ankur-singhal

标签: java android json sharedpreferences


【解决方案1】:

您可以使用 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

【讨论】:

    【解决方案2】:

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

    所以我想建议将 string[][] 数组转换为 Base64 字符串并将该字符串存储到共享首选项中,您可以轻松地将该字符串转换为 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();
    

    回到字符串 [][] ?

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

    【讨论】:

      【解决方案3】:

      这取决于您拥有 JSONArray 类的库。但是一般的方法应该是创建一个空的JSONArray(例如,我们称之为parentJsonArray),然后在循环遍历二维数组元素时将其他子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,并以通常的方式获取它,即获取简单的String

      【讨论】:

      • 会试试这个。但是转换后,我可以将其转换回原始格式吗?二维数组?
      • 是的,你可以,你只需要将字符串转换回 JSON 数组,就像这里的 stackoverflow.com/a/17012254/1889928。但在你的情况下,你有二维数组。
      猜你喜欢
      • 2021-07-05
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多