我是JSON的新手,我想知道如何提取一些信息并将其放入JSON对象然后读取一些值。 json信息看起来像这样,
{
"photos":{
"page":1,
"pages":1802,
"perpage":100,
"total":"180134",
"photo": [
{
"id":"8711964781",
"owner":"21156896@N07",
"secret":"3e24e45977",
"server":"8553",
"farm":9,
"title":"Old Harbor",
"ispublic":1,
"isfriend":0,
"isfamily":0
},
{
"id":"8712680696",
"owner":"21156896@N07",
"secret":"fe82f8387b",
"server":"8122",
"farm":9,
"title":"Rockefeller Plaza",
"ispublic":1,
"isfriend":0,
"isfamily":0
},
....
它的照片阵列还有很长一段时间。我如何获得" isPublic"的价值? "秘密"是一个字符串,因为""和isPublic是一个整数还是布尔值?我基本上必须将它们放入URL链接并下载图像。
public class ReadString extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... FlickrString) {
try {
json = getValue();
return json.getString(FlickrString[0]);
} 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();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
tvTest.setText(result);
}
这适用于所有字符串。我如何获得农场,isfriend,isfamily,ispublic转换为字符串?我现在尝试了其他的东西以获得Int值,我为读取整数创建了一个全新的类。但它没有获得正确的int值。我有它下载int并将其转换为字符串然后我使用String.valueOf(x)将textview更改为int的字符串;我究竟做错了什么?
public class ReadInt extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... FlickrString) {
try {
json = getValue();
int x = json.getInt(FlickrString[0]);
String y = String.valueOf(x);
return y;
} 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();
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
tvTest.setText(result);
}
}
谢谢!
答案 0 :(得分:2)
JSONObject jobj = result.getJSONObject("photo");
jobj.getBoolean("ispublic");
jobj.getInt("isfriend");
变量result
的类型为JsonObject
,应该包含代码中粘贴的整个对象
答案 1 :(得分:1)
Java与C ++不同。在C ++中,0为假,其他整数为真
我认为你应该创建一个像这样的函数
private void boolean convertIntToBool(int value) {
if(value==0) {
return false;
} else {
return true;
}
}
并在JSON解析中使用它,例如
boolean isfamily = convertIntToBool(jsonPhotoObject.getInt("isfamily"));
我猜你已经知道了JSON解析,所以我不会给出这么多的例子,但是如果你有另外一个关于我答案的问题,请随意在评论中提问:)
答案 2 :(得分:0)
我们假设jsonString是你的json结果。你可以得到这样的价值观:
protected String doInBackground(String... FlickrString) {
try {
JSONObject result = new JSONBOject(jsonString);
JSONObject photots = (JSONObject)result.get("photos");
JSONArray photosArray = (JSONArray) result.get("photo");
for(int i = 0; i < photosArray.length(); i++) {
JSONObject item = potosArray.get(i);
//ispublic
int ispublic = item.getInt("ispublic");
//isfriend
int isfriend = item.getInt("isfriend");
//isfamily
int isfamily = item.getInt("isfamily");
}
json = getValue();
return json.getString(FlickrString[0]);
} 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();
}
return null;
}
答案 3 :(得分:0)
我建议您尝试Jackson或Gson并将JSON转换为某些POJOs。我发现使用java对象而不是JSONObject,JSONArray等更容易且更不容易出错。这是一个如何使用Jackson工作的例子。首先,我们创建映射到JSON数据的对象:
public class Photos {
@JsonProperty
private int page;
@JsonProperty
private int pages;
...
@JsonProperty("photo")
public List<Photo> photoList;
}
public class Photo {
@JsonProperty
private String id;
@JsonProperty
private String owner;
...
@JsonProperty("ispublic")
public boolean isPublic;
@JsonProperty("isfriend")
public boolean isFriend;
@JsonProperty("isfamily")
public boolean isFamily;
}
一旦我们创建了pojos,我们就可以使用ObjectMapper将JSON数据转换为对象。至少当涉及到Jackson时,它会自动尝试将整数转换为布尔值(0 = false,其他= true)和字符串转换为布尔值(“true”和“false”)。
ObjectMapper mapper = new ObjectMapper();
Photos photos = mapper.readValue(json, Photos.class);
for(Photo photo : photos.photoList) {
if(photo.isPublic) {
// do something
}
}
PS我已经公开了pojos的一些属性,以缩短示例。您可能希望添加getter并将属性保密。