[英]How to convert a String into a JSONArray?
我正在嘗試將我的玩家陣列保存到JSONArray
,將其轉換為字符串,將其放入SharedPreferences
然后將其轉換回來。 JSONArray
我在使用當前嘗試重新加載應用程序時回來了,如果我嘗試訪問數組中的任何Player實例,則會拋出運行時異常/ ClassCast異常。
我哪里錯了?
JSONArray savedPlayers;
SharedPreferences prefs;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.indie);
savedPlayers = new JSONArray();
prefs = getSharedPreferences("appData", 0);
String jsonString = prefs.getString("playerString", null);
//Restores playerArray if any players have been saved in the past
if(jsonString != null)
{
try
{
savedPlayers = new JSONArray(JSONString);
MyListView.players.clear();
MyListView.ids.clear();
for(int i = 0; i < savedPlayers.length(); i++)
{
MyListView.players.add(((Player) savedPlayers.get(i)).getName()); //Error
MyListView.ids.add(((Player) savedPlayers.get(i)).getSaveId());
}
}
catch (JSONException e)
{
e.printStackTrace();
}
}
}
//If there are savedPlayers converts the JSONArray to a string and saved it within SharedPreferences
@Override
protected void onPause()
{
if(savedPlayers != null)
{
SharedPreferences.Editor editor = getSharedPreferences("appData", 0).edit();
String jsonString = savedPlayers.toString();
editor.putString("playerString", jsonString).commit();
}
super.onPause();
}
JSONString:
["en.deco.android.livehud.Player@44eba878","en.deco.android.livehud.Player@44ebec68"]
logcat的:
04-16 22:31:13.765: ERROR/AndroidRuntime(7496): Uncaught handler: thread main exiting due to uncaught exception
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): java.lang.RuntimeException: Unable to start activity ComponentInfo{en.deco.android.livehud/en.deco.android.livehud.GUI}: java.lang.ClassCastException: java.lang.String
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.os.Looper.loop(Looper.java:123)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at java.lang.reflect.Method.invoke(Method.java:521)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at dalvik.system.NativeStart.main(Native Method)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): Caused by: java.lang.ClassCastException: java.lang.String
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at en.deco.android.livehud.GUI.onCreate(GUI.java:102)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
04-16 22:31:13.785: ERROR/AndroidRuntime(7496): ... 11 more
04-16 22:32:57.775: ERROR/AndroidRuntime(7537): Uncaught handler: thread main exiting due to uncaught exception
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): java.lang.RuntimeException: Unable to start activity ComponentInfo{en.deco.android.livehud/en.deco.android.livehud.GUI}: java.lang.ClassCastException: java.lang.String
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.app.ActivityThread.access$2200(ActivityThread.java:119)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.os.Looper.loop(Looper.java:123)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at java.lang.reflect.Method.invoke(Method.java:521)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at dalvik.system.NativeStart.main(Native Method)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): Caused by: java.lang.ClassCastException: java.lang.String
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at en.deco.android.livehud.GUI.onCreate(GUI.java:102)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
04-16 22:32:57.795: ERROR/AndroidRuntime(7537): ... 11 more
您當前正在使用每個Player對象的toString表示創建一個JSONArray,這會產生一個字符串數組,這些字符串不包含來自Player本身字段的任何信息。 如果您要使用JSONArray / JSONObject類,則需要為每個玩家創建一個JSONObject對象,並將其添加到JSONArray中。 例如,以下代碼將創建一個JSONObject,將該播放器的名稱添加到該對象,然后將其添加到JSONArray:
JSONObject playerJsonObject = new JSONObject();
playerJsonObject.put("name", player.getName());
jsonArray.put(playerJsonObject);
但是,更簡單的JSON序列化方法是使用GSON: http : //code.google.com/p/google-gson/
你應該考慮使用傑克遜 。
所有序列化和desirialization代碼都將消失,您的生活將變得更加簡單。
String jsonString = savedPlayers.toString();
這不起作用。 它在數組中的每個對象(Player)上調用toString。 數組中的對象沒有覆蓋toString方法,因此只返回它們所在的內存空間:
en.deco.android.livehud.Player@44eba878
你需要在你的Player類中覆蓋toString,我不知道你的類看起來像什么,但它會像這樣:
public class Player {
String name;
int saveId;
public Player(String name, int saveId){
this.name = name;
this.saveId = saveId;
}
public String getName(){
return name;
}
public int getSaveId(){
return saveId();
}
@Override
public String toString(){
return "{" + "name:"+ this.name +"," + "saveId:"+ this.saveId +"}";
}
}
查看JSON站點以獲取JSON應該是的結構的參考: http : //www.json.org/
當你重寫toString()時,也建議你覆蓋hashcode();
你不應該首先將你的字符串轉換為數組,然后解析為json數組?
本機android JSON庫對於在嘗試編譯不合適的類型時出現的錯誤類型非常敏感。 因此,添加到您的每個調用JSON對象必須具有錯誤處理程序。
這導致了很多代碼和復雜性,應該是一個真正無痛的過程。 幸運的是,有些庫可以讓這種轉換變得非常簡單。 我個人推薦GSON庫: http : //code.google.com/p/google-gson/
JSON使您可以輕松地對數據進行往返,將JSON對象序列化和反序列化為應用程序使用的Java類。
閱讀使用情況頁面,您可以在4行代碼中完成轉換。 https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Generic-Types
另外,作為一個例外,@ Kaymal首先在java中首先將字符串轉換為數組。 或者,或者使用GSON,您可以從自定義類類型轉換它。 它真的那么容易。
我們需要先制作JSON對象。 例如,如果resp是一個String(例如作為http響應)
JSONObject jsonObject = new JSONObject(resp);
jsonObject可能包含其他JSON對象或JSON數組。 如何轉換JSON取決於響應。 如果arraykey是JSON對象中的數組,那么我們可以通過以下方式獲取數組列表。
JSONArray arr = jsonObject.getJSONArray("arraykey");
檢查arr的長度,如果它大於0,那么它根據數據包含JSON對象或JSON數組。 有一個完整的例子,可以在http://www.hemelix.com/JSONHandling找到關於JSON字符串到JSON數組的一些解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.