2012-11-26 54 views
0

我想从这个URL解析JSON(http://api.flickr.com/services/feeds/photos_public.gne?format=json),但文档实际上返回了无效的JSON。见Android中的Flickr JSON解析

 jsonFlickrFeed({ 
     "title": "Uploads from everyone", 
     "link": "http://www.flickr.com/photos/", 
     "description": "", 
     "modified": "2012-11-26T18:27:41Z", 
     "generator": "http://www.flickr.com/", 
     "items": [ 
     { 
      "title": "2012 Thanksgiving Holiday Weekend", 
      "link": "http://www.flickr.com/photos/agape_boarding_school/8220697785/", 
      "media": {"m":"http://farm9.staticflickr.com/8478/8220697785_bb298ac5b3_m.jpg"}, 
      "date_taken": "2012-11-24T14:19:21-08:00", 
      "description": " <p><a href=\"http://www.flickr.com/people/agape_boarding_school/\">Agape Boarding School<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/agape_boarding_school/8220697785/\" title=\"2012 Thanksgiving Holiday Weekend\"><img src=\"http://farm9.staticflickr.com/8478/8220697785_bb298ac5b3_m.jpg\" width=\"240\" height=\"159\" alt=\"2012 Thanksgiving Holiday Weekend\" /><\/a><\/p> <p>Great Day at Agape Boarding School<\/p>", 
      "published": "2012-11-26T18:27:41Z", 
      "author": "[email protected] (Agape Boarding School)", 
      "author_id": "[email protected]", 
      "tags": "school boarding agape" 
     }, ... 

我想让我的分析器是尽可能通用那么,什么是更好的方式来删除“jsonFlickrFeed(”文档的一部分,只与JSON它自身工作?

public class JSONParser extends AsyncTask <String, Void, JSONObject> { 

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

// constructor 
public JSONParser() { 

} 

@Override 
protected JSONObject doInBackground(String... params) { 
    String url=params[0]; 

    // Making HTTP request 
    try { 
     // defaultHttpClient 
     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; 
} 

}

+0

这看起来像是一个JSONP调用的结果,带有&callback = jsonFlickrFeed ...? –

+0

@ScottEvernden,我认为你是对的。我对这个主题不太了解。我只是google了一下,看起来像一个JSONP。事情是我只需要JSON,而不需要依赖我的类应用程序。 – Medeiros

回答

0

正如你所说,你只会有你解析它之前删除字符串的这一部分。

如果你想成为更普遍的,你可以搜索第一{ char并删除它之前的所有内容,并删除最后的} char,并删除它后面的所有内容。但是这仍然不能确保输入有效。

+0

没错,我需要“修剪”文档。我想知道是否有办法做到这一点,而不需要修改我的解析器类。因为如果我这样做,我需要重写我的JSON解析器每次发生类似的事情。这不是一个好的编程习惯。作为一名Python程序员,我认为正则表达式可以像''。*(\\ {。* \\})。*“'一样轻松地解决修剪部分问题。 – Medeiros

+0

您可以使用正则表达式,但当服务器响应较大时,它可能会使您的应用程序反应缓慢。我认为最好的解决方案是从AsyncTask返回一个字符串,并在使用它的每个类/项目中以不同的方式进行解析。 – Rotem