试图解析Instagram JSON

时间:2014-09-02 20:32:06

标签: android json

我的应用在尝试解析Instagram JSON时崩溃了。我在这里做错了什么?

public class InstagramActivity extends BaseActivity {

    static String url;

    static ArrayList<String> thumbnailURLS;
    static ArrayList<String> standardURLS;

    static Context context;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_grid);

        context = getApplicationContext();

        getActionBar().setTitle("Instagram");

        url = "https://api.instagram.com/v1/users/1373666362/media/recent/?client_id=a2b04732b52d43c99fe453a8ca2a5512&count=50";

        thumbnailURLS = new ArrayList<String>();
        standardURLS = new ArrayList<String>();

        new ParseJSON().execute();
    }

    public static class JSONParser {
        static InputStream is = null;
        static JSONObject jObj = null;
        static String json = "";

        // constructor
        public JSONParser()
        {

        }

        public JSONObject getJSONFromUrl(String jsonUrl)
        {
            // Making HTTP request
            try
            {
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(jsonUrl);

                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 to 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;
        }
    }

    public static class ParseJSON extends AsyncTask<Void,Void,ArrayList> {
        @Override
        protected void onPreExecute()
        {
            // TODO Auto-generated method stub
            super.onPreExecute();
        }

        @Override
        protected ArrayList doInBackground(Void... params) {
            JSONParser jParser = new JSONParser();

            // get json from url here
            JSONObject json = jParser.getJSONFromUrl(url);

            try {
                JSONArray dataArray = json.getJSONArray("data");
                int thumbnailsCount = dataArray.length();

                for (int i = 0; i < thumbnailsCount; i++) {
                    JSONObject imagesObject = dataArray.getJSONObject(i).getJSONObject("images");
                    String thumbURL = imagesObject.getJSONObject("thumbnail").getString("url");
                    thumbnailURLS.add(thumbURL);
                }
            }
            catch (Exception e) {
                e.getMessage().toString();
            }

            return thumbnailURLS;
        }

        @Override
        protected void onPostExecute(ArrayList result) {
            super.onPostExecute(result);

            for (String thumb : thumbnailURLS) {
                System.out.println(thumb);
            }
        }
    }
}

它捕获JSONException

E/JSON Parser﹕ Error parsing data org.json.JSONException: End of input at character 0 of

E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #2

这是NULL。 JSONObject json = jParser.getJSONFromUrl(url);

以下是一些预期的JSON。

{
  "pagination":  {
    "next_url": "https://api.instagram.com/v1/users/1373666362/media/recent?access_token=25320296.1fb234f.b797e861c2494059b6584ac9749208fe&count=2&max_id=791341826737262101_1373666362",
    "next_max_id": "791341826737262101_1373666362"
  },
  "meta":  {
    "code": 200
  },
  "data":  [
     {
      "attribution": null,
      "tags":  [
        "kystatefair"
      ],
      "type": "image",
      "location": null,
      "comments":  {
        "count": 0,
        "data":  []
      },
      "filter": "Amaro",
      "created_time": "1408648864",
      "link": "http://instagram.com/p/r-MuYWFU96/",
      "likes":  {
        "count": 5,
        "data":  [
           {
            "username": "tayworthington_",
            "profile_picture": "http://photos-g.ak.instagram.com/hphotos-ak-xaf1/10632550_835588266460870_765781001_a.jpg",
            "id": "24471760",
            "full_name": "τᎯϓιΘર"
          },
           {
            "username": "renee_laurent",
            "profile_picture": "http://images.ak.instagram.com/profiles/profile_407687505_75sq_1397913189.jpg",
            "id": "407687505",
            "full_name": "Renee Laurent"
          },
           {
            "username": "kystatefair",
            "profile_picture": "http://images.ak.instagram.com/profiles/profile_381460857_75sq_1396983015.jpg",
            "id": "381460857",
            "full_name": "kystatefair"
          },
           {
            "username": "jennaharrod1",
            "profile_picture": "http://photos-b.ak.instagram.com/hphotos-ak-xfa1/10665605_1495839117327497_809128971_a.jpg",
            "id": "18591399",
            "full_name": "Jenna Harrod"
          }
        ]
      },
      "images":  {
        "low_resolution":  {
          "url": "http://scontent-a.cdninstagram.com/hphotos-xaf1/t51.2885-15/10598650_352432021574566_306460147_a.jpg",
          "width": 306,
          "height": 306
        },
        "thumbnail":  {
          "url": "http://scontent-a.cdninstagram.com/hphotos-xaf1/t51.2885-15/10598650_352432021574566_306460147_s.jpg",
          "width": 150,
          "height": 150
        },
        "standard_resolution":  {
          "url": "http://scontent-a.cdninstagram.com/hphotos-xaf1/t51.2885-15/10598650_352432021574566_306460147_n.jpg",
          "width": 640,
          "height": 640
        }
      },
      "users_in_photo":  [],
      "caption":  {
        "created_time": "1408648864",
        "text": "Congratulations to The Lindsey Family for winning the Gospel Quartet competition! #kystatefair",
        "from":  {
          "username": "kyfarmbureau",
          "profile_picture": "http://photos-b.ak.instagram.com/hphotos-ak-xpf1/10349740_650479825030913_1755233568_a.jpg",
          "id": "1373666362",
          "full_name": "Kentucky Farm Bureau"
        },
        "id": "792126548887293629"
      },
      "user_has_liked": false,
      "id": "792126548258148218_1373666362",
      "user":  {
        "username": "kyfarmbureau",
        "website": "",
        "profile_picture": "http://photos-b.ak.instagram.com/hphotos-ak-xpf1/10349740_650479825030913_1755233568_a.jpg",
        "full_name": "Kentucky Farm Bureau",
        "bio": "",
        "id": "1373666362"
      }
    },
     {
      "attribution": null,
      "tags":  [
        "kfbmtc"
      ],
      "type": "image",
      "location": null,
      "comments":  {
        "count": 0,
        "data":  []
      },
      "filter": "Normal",
      "created_time": "1408555318",
      "link": "http://instagram.com/p/r7aTLelU4V/",
      "likes":  {
        "count": 4,
        "data":  [
           {
            "username": "corkey_cole",
            "profile_picture": "http://photos-e.ak.instagram.com/hphotos-ak-xaf1/10598220_490230854445140_2139881142_a.jpg",
            "id": "324166968",
            "full_name": "corkey_cole"
          },
           {
            "username": "renee_laurent",
            "profile_picture": "http://images.ak.instagram.com/profiles/profile_407687505_75sq_1397913189.jpg",
            "id": "407687505",
            "full_name": "Renee Laurent"
          },
           {
            "username": "silveradomafia04",
            "profile_picture": "http://photos-e.ak.instagram.com/hphotos-ak-xfa1/914483_1500860143488988_1771984176_a.jpg",
            "id": "1006562558",
            "full_name": "Gideon Bailey"
          },
           {
            "username": "sharelouisville",
            "profile_picture": "http://images.ak.instagram.com/profiles/profile_1302605134_75sq_1399019203.jpg",
            "id": "1302605134",
            "full_name": "Share Louisville"
          }
        ]
      },
      "images":  {
        "low_resolution":  {
          "url": "http://scontent-a.cdninstagram.com/hphotos-xaf1/t51.2885-15/10598436_1456586981280578_133918080_a.jpg",
          "width": 306,
          "height": 306
        },
        "thumbnail":  {
          "url": "http://scontent-a.cdninstagram.com/hphotos-xaf1/t51.2885-15/10598436_1456586981280578_133918080_s.jpg",
          "width": 150,
          "height": 150
        },
        "standard_resolution":  {
          "url": "http://scontent-a.cdninstagram.com/hphotos-xaf1/t51.2885-15/10598436_1456586981280578_133918080_n.jpg",
          "width": 640,
          "height": 640
        }
      },
      "users_in_photo":  [],
      "caption":  {
        "created_time": "1408555318",
        "text": "Media is starting to crowd around for #kfbmtc",
        "from":  {
          "username": "kyfarmbureau",
          "profile_picture": "http://photos-b.ak.instagram.com/hphotos-ak-xpf1/10349740_650479825030913_1755233568_a.jpg",
          "id": "1373666362",
          "full_name": "Kentucky Farm Bureau"
        },
        "id": "791341827391573199"
      },
      "user_has_liked": false,
      "id": "791341826737262101_1373666362",
      "user":  {
        "username": "kyfarmbureau",
        "website": "",
        "profile_picture": "http://photos-b.ak.instagram.com/hphotos-ak-xpf1/10349740_650479825030913_1755233568_a.jpg",
        "full_name": "Kentucky Farm Bureau",
        "bio": "",
        "id": "1373666362"
      }
    }
  ]
}

更新:问题似乎与Instagram api url我使用isn不给我JSON。我想这可能是因为我使用的是client_id而不是获取访问令牌。有谁知道是否是这种情况?我使用了其他我认为不需要访问令牌的JSON URL,它返回了JSON就好了。

1 个答案:

答案 0 :(得分:2)

我更新了您的方法getJSONFromUrl,如下所示:

问题在于,服务器返回405表示method not allowed。您正在使用POST来访问此服务器不允许的数据。您必须在此处使用GET才能获得成功请求。

你的其余代码工作正常。

您可以更新下面的代码来添加一个默认情况,您可以返回一个有效的常量json字符串,其中包含一条可以避免应用程序崩溃的消息,还可以添加其他情况,如404和405,并返回一个有效的json适当的消息,适合用户理解。

public JSONObject getJSONFromUrl(String jsonUrl)
    {


        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(jsonUrl);
        String responseBody = "DEFAULT_MSG_TEXT";
        int resCode = 0;

        try{

            HttpResponse response = client.execute(get);

            int responseCode = response.getStatusLine().getStatusCode();
            resCode = responseCode;

            switch(responseCode) {
            case 200:
            HttpEntity entity = response.getEntity();
                if(entity != null) {
                    responseBody = EntityUtils.toString(entity);
                }
                break;
            }

        }
        catch(Exception ex){
            Log.e("Post Error",resCode + "\n Exception" + ex);
            responseBody = "DEFAULT_MSG_TEXT";
        }


        json = responseBody;


        // try to 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;
    }
}

试试这个让我知道!!!