gpt4 book ai didi

java - 从 Tumblr 解析 JSONObject

转载 作者:行者123 更新时间:2023-12-01 05:09:02 25 4
gpt4 key购买 nike

我正在尝试自学制作 Android 应用程序,因此我正在尝试创建一个应用程序,在 ListView 中显示来自 tumblr 帐户的图像。

我在解析 JSONObject 时遇到一些问题,并且我的应用程序因 nullPointerException 而崩溃。

我的代码如下所示:

public class Example extends Activity {

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

ArrayList<Tweet> tweets;
try {
tweets = getTweets();
ListView listView = (ListView) findViewById(R.id.ListViewId);
listView.setAdapter(new UserItemAdapter(this, R.layout.listitem,
tweets));
} catch (ClientProtocolException 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();
}

}

public class UserItemAdapter extends ArrayAdapter<Tweet> {
private ArrayList<Tweet> tweets;

public UserItemAdapter(Context context, int imageViewResourceId,
ArrayList<Tweet> tweets) {
super(context, imageViewResourceId, tweets);
this.tweets = tweets;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.listitem, null);
}

Tweet tweet = tweets.get(position);
if (tweet != null) {

ImageView image = (ImageView) v.findViewById(R.id.avatar);

if (image != null) {
image.setImageBitmap(getBitmap(tweet.image_url));
}
}
return v;
}
}

public Bitmap getBitmap(String bitmapUrl) {
try {
URL url = new URL(bitmapUrl);
return BitmapFactory.decodeStream(url.openConnection()
.getInputStream());
} catch (Exception ex) {
return null;
}
}

public ArrayList<Tweet> getTweets() throws ClientProtocolException,
IOException, JSONException {
String searchUrl = "http://api.tumblr.com/v2/blog/www.richkidsofinstagram.tumblr.com/posts?api_key=API_KEY";

ArrayList<Tweet> tweets = new ArrayList<Tweet>();

HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(searchUrl);

ResponseHandler<String> responseHandler = new BasicResponseHandler();

String responseBody = null;
try {
responseBody = client.execute(get, responseHandler);
} catch (Exception ex) {
ex.printStackTrace();
}

JSONObject jsonObject = new JSONObject(responseBody);

JSONArray arr = null;

try {
arr = jsonObject.getJSONArray("results");
} catch (Exception ex) {
Log.v("TEST", "Exception: " + ex.getMessage());
}

for (int i = 0; i < arr.length(); i++) {
Tweet tweet = new Tweet(arr.getJSONObject(i).getString("photos"));
tweets.add(tweet);
}

return tweets;
}

public class Tweet {

public String image_url;

public Tweet(String url) {

this.image_url = url;
}
}
}

nullPointerException 发生在第 124 行:

  for (int i = 0; i < arr.length(); i++) {
Tweet tweet = new Tweet(arr.getJSONObject(i).getString("photos"));
tweets.add(tweet);
}

我还通过 www.jsonlint.com 验证了地址,JSON 如下所示:

{
"meta": {
"status": 200,
"msg": "OK"
},
"response": {
"blog": {
"title": "Rich Kids Of Instagram",
"posts": 154,
"name": "richkidsofinstagram",
"url": "http://richkidsofinstagram.tumblr.com/",
"updated": 1346803265,
"description": "They have more money than you and this is what they do.
"ask": true,
"ask_anon": true
},
"posts": [
{
"blog_name": "richkidsofinstagram",
"id": 30900248446,
"post_url": "http://richkidsofinstagram.tumblr.com/post/30900248446/hamptons-are-good",
"slug": "hamptons-are-good",
"type": "photo",
"date": "2012-09-04 23:58:45 GMT",
"timestamp": 1346803125,
"state": "published",
"format": "html",
"reblog_key": "2KosMjea",
"tags": [
"pool",
"hamptons",
"summer",
"rich",
"wealth"
],
"highlighted": [],
"note_count": 99,
"caption": "<p><span>The Hamptons are…….. good. by matthewmorton</span></p>",
"photos": [
{
"caption": "",
"alt_sizes": [
{
"width": 500,
"height": 500,
"url": "http://24.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_500.jpg"
},
{
"width": 400,
"height": 400,
"url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_400.jpg"
},
{
"width": 250,
"height": 250,
"url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_250.jpg"
},
{
"width": 100,
"height": 100,
"url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_100.jpg"
},
{
"width": 75,
"height": 75,
"url": "http://25.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_75sq.jpg"
}
],
"original_size": {
"width": 500,
"height": 500,
"url": "http://24.media.tumblr.com/tumblr_m9uiqy9Mi71rb86ldo1_500.jpg"
}
}
]
},

我认为问题是我没有指定我想要的图片尺寸或类似的东西,但我不知道如何解决这个问题。

如果有人能帮我解决这个问题,我将不胜感激。

最佳答案

请注意哪一行到底是 124,复制并粘贴您的代码,最后总共只有约 115 行?无论如何,这里是:

for (int i = 0; i < arr.length(); i++) {

通常情况下应该没问题,因为调用了 set arr应该抛出 JSONException如果没有名为“results”的数组,则会出现异常。不过,您吃掉了该异常,然后将其记录下来,这可能会留下 arrnull 。另外,我在您的 JSON 中没有看到任何“结果”,您的意思是“响应”吗?这是我的猜测,如果您得到 NullPointerException .

如果您愿意,可以停止阅读这里,但要解释为什么我猜测接下来的两行不是 124/不是抛出异常的行:

Tweet tweet = new Tweet(arr.getJSONObject(i).getString("photos"));

这看起来很安全,因为如果 arr 不为空 getJSONObject()应该为您的 i 返回一些东西值(value)观。和getString()会抛出 JSONException如果找不到“照片”。 (我不确定 Tweet 类到底是什么,所以如果“photos”返回 null 并且 Tweet 构造函数因 null 参数而死亡,那么可能就是这样,但我不知道......)

tweets.add(tweet);

这看起来也很安全,因为您初始化了 tweetsnew ArrayList<Tweet>();即使 tweet为空,ArrayList()不会有任何问题。

关于java - 从 Tumblr 解析 JSONObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12284678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com