2011-05-03 19 views
4

我想解析來自URL的JSON響應,但總是出錯。我嘗試了很多,但未能解決問題。請建議我糾正錯誤。如何解析android中的大JSON文件

我的JSON響應:

{ 
"classification": { 
    "relevancyScore": 999, 
    "searchUrl": { 
     "value": "http://www.bizrate.com/iphone-cases/index__rf--af1__af_assettype_id--10__af_creative_id--6__af_id--50085__af_placement_id--1.html" 
    } 
}, 
[.. hundreds of lines removed ..] 

我的代碼:

public class test extends Activity { 

    /** Called when the activity is first created. */ 
    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ListView lv = (ListView)findViewById(R.id.listView1); 

     lv.setAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, this.fetchTwitterPublicTimeline()));   
    } 

    public ArrayList<String> fetchTwitterPublicTimeline() 
    { 
     ArrayList<String> listItems = new ArrayList<String>(); 

     try { 
      URL twitter = new URL(
        "http://catalog.bizrate.com/services/catalog/v1/us/product?publisherId=50085&placementId=1&categoryId=1&keyword=iphone+cases&start=0&results=10&sort=relevancy_desc&brandId=&attFilter=&zipCode=90291&biddedOnly=&minRelevancyScore=100&apiKey=58f536aa2fab110bbe0da501150bac1e&format=json"); 
      URLConnection tc = twitter.openConnection(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(
        tc.getInputStream())); 

      String line; 
      String str; 
      while ((line = in.readLine()) != null) { 
       //str = line.substring(line.indexOf("{"), line.lastIndexOf(line)); 
       //str = line.replaceAll("BIZRATE.Suggest.callback(", null); 
       //str = str.replaceAll(")", null); 
       //System.out.println("SubString:"+str); 
       JSONArray ja = new JSONArray(line); 

       for (int i = 0; i < ja.length(); i++) { 
        JSONObject jo = (JSONObject) ja.get(i); 
        System.out.println("value----"+jo.getJSONObject("product")); 
        //listItems.add(jo.getString("suggestions")); 
       } 
      } 
     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return listItems; 
    } 
} 

我要解析的所有產品的信息。

+3

你會得到什麼錯誤?爲什麼要將每行解析爲JSONArray?你能確定一排真的是一個數組嗎? – alopix 2011-05-03 06:04:29

回答

1

之前必須先下載完整的JSON可以解析它。這應該可以幫助你在你的項目中:

try { 
    URL twitter = new URL("http://catalog.bizrate.com/services/catalog/v1/us/product?publisherId=50085&placementId=1&categoryId=1&keyword=iphone+cases&start=0&results=10&sort=relevancy_desc&brandId=&attFilter=&zipCode=90291&biddedOnly=&minRelevancyScore=100&apiKey=58f536aa2fab110bbe0da501150bac1e&format=json"); 
    URLConnection tc = twitter.openConnection(); 
    BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream())); 
    String line; 
    String str = ""; 
    while ((line = in.readLine()) != null) { 
     str += line; 
    } 
    JSONObject jo = new JSONObject(str); 
    JSONArray ja = jo.getJSONObject("products").getJSONArray("product"); 
    for (int i = 0; i < ja.length(); i++) { 
     Log.i("MyDebug", "value----" + ja.getJSONObject(i).getString("manufacturer")); 
    } 
} catch (MalformedURLException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

記得用has("")工作,如果你不知道某些,關鍵existst做。

2

如果你有一個來自服務器的大JSON文件,最好使用gson解析器。我在閱讀大JSON時也出現內存不足錯誤。因爲JSON首先將數據加載到解析它的內存中。所以可能會出現內存異常的變化。