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