0

この 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;
}

}

4

3 に答える 3

11

私は与えられた方法でこの問題を解決しました。

Flickr の古い Web APIは次のとおりです: http://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json

Flickr の最新の Web APIは次のとおりです: http://api.flickr.com/services/feeds/photos_public.gne?id=xxxxxxxx&lang=en-us&format=json&nojsoncallback=1

最新の 1 つの Web APIを使用します。

xxxxxxxxの代わりにユーザー IDを置き換えます。

お役に立てば幸いです。

于 2013-09-25T06:54:35.110 に答える
1

あなたが望むのは生のjsonのようです。関数ラッパーを削除するには、「nojsoncallback=1」を追加する必要があります。

[FLICKR JSON 応答形式を参照してください]( https://forum.processing.org/one/topic/flickr-json-parsing-noob.html「関数ラッパーなしで生の JSON が必要な場合」)

于 2018-05-27T03:23:17.290 に答える
0

あなたが言ったように、解析する前に文字列のこの部分を削除するだけです。

より一般的になりたい場合は、最初の{文字を検索してその前のすべてを削除し、最後の}文字を検索してそれ以降のすべてを削除できます。ただし、これでも入力が有効であることは保証されません。

于 2012-11-26T20:02:28.143 に答える