如何在android中解析一个大的JSON文件

时间:2011-05-03 05:57:17

标签: android json

我想从URL解析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 个答案:

答案 0 :(得分:2)

如果你有一个来自服务器的大型JSON文件,最好使用gson解析器。我在阅读大JSON时也出现内存不足错误。因为JSON首先将数据加载到解析它的内存中。因此可能会出现内存不足异常的变化。

答案 1 :(得分:1)

你可以使用一个开放的API Gson.jar从Json中获取数据..它以标准化方式获取数据...例如试试...... http://blog.foos-bar.com/2010/08/parsing-facebook-json.html

答案 2 :(得分: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("")