2

この JSON オブジェクトのすべての「listPages」を反復処理するにはどうすればよいですか?

  {
        "listPages": [
            {
                "title": "Accounts",
                "recordType": "Company",
            },
            {
                "title": "Contacts",
                "recordType": "Person",
            }
        ]
    }

このコードを使用して、listPages 配列の各項目からリスト項目をリストに追加しようとしています。

    JSONObject JSONConfig = envConfig.getEnvConfig(this);

    try{
        JSONArray listPages = JSONConfig.getJSONArray("listPages");         
        for(int i = 0 ; i < listPages.length() ; i++){
            listItems.add(listPages.getJSONObject(i).getString("title"));
        }
        adapter.notifyDataSetChanged();
    }catch(Exception e){
        e.printStackTrace();
    }

システムエラーが発生していることをlogcatで確認できます:次の行で「java.lang.NullPointerException」。

JSONArray listPages = JSONConfig.getJSONArray("listPages");

他の質問を読んで微調整しようとしましたが、わかりません。助けていただければ幸いです。

ここに私のenvConfig.javaクラスがあります

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.json.JSONObject;

import android.content.Context;
import android.util.Log;

public class EnvConfig {

    private String rawJSONString;
    private JSONObject jsonObjRecv;

    public JSONObject getEnvConfig(Context context){
        InputStream inputStream = context.getResources().openRawResource(
                R.raw.envconfigg);
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                inputStream));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        rawJSONString = sb.toString();
        try {
            JSONObject jsonObjRecv = new JSONObject(rawJSONString);
            Log.i("Test", "<JSONObject>\n" + jsonObjRecv.toString()
                    + "\n</JSONObject>");
        } catch (Exception e) {
            e.printStackTrace();
        }

        return jsonObjRecv;
    }
}
4

2 に答える 2

1

これは、インスタンスのシャドウイングの典型的な問題です。メソッド内のtryブロックで、クラス変数と同じ名前の新しい変数を宣言します。したがって、クラス変数はシャドウされ、初期化されることはありません。後でメソッドから返すと、nullになります。

public class EnvConfig {

    private String rawJSONString;
    private JSONObject jsonObjRecv; // <-- you declare a class variable here

    // ...

    try {
        JSONObject jsonObjRecv = new JSONObject(rawJSONString); // <-- shadowed here!

JSONを繰り返し再解析することを避けようとしているのでない限り、クラス変数を完全に削除することをお勧めします。それ以外の場合は、ローカル変数を削除します。

于 2013-03-06T03:12:29.737 に答える
0

JSON データの解析に使用するコードは次のとおりです。使用している JSONConfig には詳しくありませんが、これは私にとっては完全に機能します。

JSONObject jsonObject = (JSONObject) new JSONTokener(/*Json String Data*/).nextValue();
JSONArray jsonArray = jsonObject.getJSONArray(/*Name of JSON Array*/);
于 2013-03-06T02:09:08.820 に答える