0

json オブジェクトを解析してリスト ビューに入力しようとしていますが、問題に直面しています。助けてください

NullpointerException が発生しています

ここに私の完全なコードがあります:

次のURLからデータを解析しています

解析中の URL

データを解析するためのコード

 public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

public JSONParser(){

}

public JSONObject getJSONFromUrl(String url){

//making Http request
try{
//default httpclient    
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

}
    catch (UnsupportedEncodingException e) {
    e.printStackTrace();
    }
catch (ClientProtocolException e) {
    e.printStackTrace();

}
catch(IOException e){
    e.printStackTrace();
    }
    try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);

        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } 
catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    // try parse the string to a JSON object
    try {
        jObj = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON Parser", "Error parsing data " + e.toString());
    }

    // return JSON String
    return jObj;

}

}

here is activity code

public class AndroidJSONParsingActivity extends ListActivity {

// url to make request
private static String url = "http://www.kaverisoft.com/careers/assignments/android/a1.php";

// JSON NAme Node

private static final String TAG_BOOK = "book";
private static final String TAG_ID = "id";
private static final String TAG_TITLE = "title";
private static final String TAG_AUTHORS = "authors";
private static final String TAG_DESCRIPTION = "description";
private static final String TAG_PRICE = "price";


//Book JSONArray
JSONArray book = null;

@Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // HashMap for ListView

    ArrayList<HashMap<String, String>> bookList = new ArrayList<HashMap<String, String>>();

    // creating Json parser instance
    JSONParser jParser = new JSONParser();

    // getting Json String from url

    JSONObject json = jParser.getJSONFromUrl(url);

    try{
        // getting array of books

        book = json.getJSONArray(TAG_BOOK);

    // looping through all books

        for(int i=0;i<book.length();i++){

            JSONObject c = book.getJSONObject(i);


            // storing each json item in variable

            String title = c.getString(TAG_TITLE);
            String price = c.getString(TAG_PRICE);
            String authors = c.getString(TAG_AUTHORS);
            String id = c.getString(TAG_ID);
            String description = c.getString(TAG_DESCRIPTION);



            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();

            map.put(TAG_ID, id);
            map.put(TAG_TITLE, title);
            map.put(TAG_PRICE, price);
            map.put(TAG_AUTHORS, authors);
            map.put(TAG_DESCRIPTION, description);

            bookList.add(map);


        }

    }

        catch (JSONException e) {
            e.printStackTrace();    

        }

    // Updating Parsed Data into ListView

    ListAdapter adapter = new SimpleAdapter(this, bookList,
            R.layout.list_item,
            new String[]{TAG_TITLE,TAG_DESCRIPTION,TAG_AUTHORS } , new int[] {
            R.id.title,R.id.description,R.id.author });

setListAdapter(adapter);

// selecting single list view item

ListView lv = getListView();

 // Launching new screen on Selecting Single ListItem
    lv.setOnItemClickListener(new OnItemClickListener() {


        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String title = ((TextView) view.findViewById(R.id.title)).getText().toString();
            String authors = ((TextView) view.findViewById(R.id.author)).getText().toString();
            String description = ((TextView) view.findViewById(R.id.description)).getText().toString();

            // Starting new intent
            Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
            in.putExtra(TAG_TITLE, title);
            in.putExtra(TAG_AUTHORS, authors);
            in.putExtra(TAG_DESCRIPTION, description);
            startActivity(in);

        }
    });



}

}

book オブジェクトのみを解析しようとしています

私の問題を解決してください。

LogCat の詳細

08-24 00:56:48.202: W/dalvikvm(949): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-24 00:56:48.263: E/AndroidRuntime(949): FATAL EXCEPTION: main
08-24 00:56:48.263: E/AndroidRuntime(949): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sree.androidjsonparser/com.sree.androidjsonparser.AndroidJSONParsingActivity}: java.lang.NullPointerException
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.os.Looper.loop(Looper.java:123)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.app.ActivityThread.main(ActivityThread.java:4627)
08-24 00:56:48.263: E/AndroidRuntime(949):  at java.lang.reflect.Method.invokeNative(Native Method)
08-24 00:56:48.263: E/AndroidRuntime(949):  at java.lang.reflect.Method.invoke(Method.java:521)
08-24 00:56:48.263: E/AndroidRuntime(949):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-24 00:56:48.263: E/AndroidRuntime(949):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-24 00:56:48.263: E/AndroidRuntime(949):  at dalvik.system.NativeStart.main(Native Method)
08-24 00:56:48.263: E/AndroidRuntime(949): Caused by: java.lang.NullPointerException
08-24 00:56:48.263: E/AndroidRuntime(949):  at com.sree.androidjsonparser.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:62)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-24 00:56:48.263: E/AndroidRuntime(949):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-24 00:56:48.263: E/AndroidRuntime(949):  ... 11 more
08-24 00:56:53.812: I/Process(949): Sending signal. PID: 949 SIG: 9
4

1 に答える 1

1

あなたの問題はあなたの JSONParser にあり、サイトから返された JSON は整形式ではありません。似たような名前の JSONObjects を内部に持つ JSONObjects がたくさんあります。私はそれに対処するための迅速かつ簡単な解決策を作成しましたが、JSON を生成するコードを制御する場合は、アイテムのカテゴリ (本、音楽、カメラ) を独自の JSONArray にグループ化することをお勧めします。

Web サイトから返される JSON は、JSONObjects を含む JSONArray です。次のことを行っています。

jObj = 新しい JSONObject(json);

あなたがしているはずです

jObj = 新しい JSONArray(json);

次に、戻り値を JSONObject ではなく JSONArray に変更する必要があります

次に、メイン アクティビティで「json」を JSONArray に変更し、「book」を削除します。JSONArray をループするだけです。

また、試行をループ内に移動します。

JSONParser jParser = new JSONParser();

            // getting Json String from url

            JSONArray json = jParser.getJSONFromUrl(url);


                // getting array of books

               //Get rid of this = book = json.getJSONArray(TAG_BOOK);

            // looping through all books

                 for(int i=0;i<json.length();i++){
                try{
                JSONObject parent = json.getJSONObject(i);
                JSONObject c  = parent.optJSONObject("camera");
                if(c == null)
                    c = parent.optJSONObject("book");
                if(c == null)
                    c = parent.optJSONObject("music");
                // storing each json item in variable

                String title = c.getString(TAG_TITLE);
                String price = c.getString(TAG_PRICE);
                String authors = c.getString(TAG_AUTHORS);
                String id = c.getString(TAG_ID);
                String description = c.getString(TAG_DESCRIPTION);
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();

                map.put(TAG_ID, id);
                map.put(TAG_TITLE, title);
                map.put(TAG_PRICE, price);
                map.put(TAG_AUTHORS, authors);
                map.put(TAG_DESCRIPTION, description);

                bookList.add(map);

            }

            catch (JSONException e) {
                e.printStackTrace();    

            }
            }

- - -編集

私のコメントで提案されているように、JSON 出力を作成するコードをやり直す必要があります。

簡単に言えば、「カテゴリ」ごとに JSONObjects を含むマスター配列が必要であり、これらの各カテゴリは JSONArray の JSONObject になります。

JSON は次のようになります。

[
{ "camera" :
[
   {
   "picture":"http://qqq.com",
   "price":9.99
    },
 {
   "picture":"http://eee.com",
   "price":9.99
    }
]
},
{ "music" :
[
   {
   "picture":"http://aaa.com",
   "price":9.99
    },
 {
   "picture":"http://sss.com",
   "price":9.99
    }
]
},
{ "book" :
[
   {
   "picture":"http://fff.com",
   "price":9.99
    },
 {
   "picture":"http://ggg.com",
   "price":9.99
    }
]
}
]

このようにして、さまざまなカテゴリに対してさまざまなアクションを (必要に応じて) 実行し、カテゴリ内の類似の JSON オブジェクトをすべてグループ化することができます。

または、本、音楽、カメラのいずれであってもアクションが同じである場合は、JSON オブジェクトに「タイプ」用の別のフィールドを追加し、名前なしで配列 (JSON_array.put()) に JSONObject を作成できます。したがって、次のように表示されます

[
{
"type":"camera",
"picture":"http://img5.flixcart.com/image/camera/5/p/a/nikon-d90-slr-40x40-imacxmh3y6wmqh8b.jpeg",
"model":"D90 SLR with AF-S 18-105mm VR Kit Lens",
"make":"Nikon",
"price":57182.0
},
{
"type":"book",
"description":"This book is one of a series of texts written by faculty of the Electrical Engineering and Computer Science Department at the Massachusetts Institute of Technology. It was edited and produced by The MIT Press under a joint production-distribution arrangement with the McGraw-Hill Book Company.",
"authors":"Harold Abelson and Gerald Jay Sussman with Julie Sussman",
"price":469.0,
"id":51087,
"title":"Structure and Interpretation of Computer Programs"
}
]

繰り返しますが、取るべきルートは、後でデータをどうするかによって異なります。

于 2012-08-23T19:32:53.977 に答える