簡體   English   中英

如何將String轉換為JSONArray?

[英]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,您可以從自定義類類型轉換它。 它真的那么容易。

GSON非常適合JSON操作:

與你的問題完全相同的問題在這里得到解答:

無法將字符串轉換為JsonArray

我們需要先制作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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM