【问题标题】:Flickr JSON Parsing in AndroidAndroid 中的 Flickr JSON 解析
【发布时间】:2012-11-26 19:25:24
【问题描述】:

我想从这个 url (http://api.flickr.com/services/feeds/photos_public.gne?format=json) 解析 JSON,但文档实际上返回了一个无效的 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": "nobody@flickr.com (Agape Boarding School)",
            "author_id": "36563683@N07",
            "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;
}

}

【问题讨论】:

  • 这看起来像是 JSONP 调用的结果,带有 &callback=jsonFlickrFeed ...??
  • @ScottEvernden,我认为你是对的。我对这个主题了解不多。我只是用谷歌搜索它,看起来像一个 JSONP。问题是我只需要 JSON 而不使我的类应用程序依赖。

标签: android json parsing flickr


【解决方案1】:

我已经通过给定的方式解决了这个问题。

Flickr 旧 Web API 是:http://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json

Flickr 最新的网络 API 是:http://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json&nojsoncallback=1

使用最新的一个网络 API

替换你的用户ID而不是xxxxxxxx

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    看起来你想要的是原始 json。您需要添加“nojsoncallback=1”来删除函数包装器。

    [查看 FLICKR JSON 响应格式](https://forum.processing.org/one/topic/flickr-json-parsing-noob.html"如果您只想要原始 JSON,没有函数包装")

    【讨论】:

      【解决方案3】:

      正如你所说,你只需要在解析之前删除这部分字符串。

      如果您想更通用,您可以搜索第一个 { 字符并删除它之前的所有内容,然后搜索最后一个 } 字符并删除它之后的所有内容。但这仍然不能确保输入是有效的。

      【讨论】:

      • 没错,我需要“修剪”文档。我想知道是否有办法在不修改我的解析器类的情况下做到这一点。因为如果我这样做,我需要在每次发生类似情况时重写我的 JSON 解析器。这不是一个好的编程习惯。作为一名 Python 程序员,我认为正则表达式可以像 ".*(\\{.*\\}).*" 一样轻松解决修剪部分。
      • 您可以使用正则表达式,但是当服务器响应很大时,它可能会使您的应用程序反应缓慢。我认为对您来说最好的解决方案是从 AsyncTask 返回一个字符串并在每个类中以不同方式解析它/project 使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多