Android中的JSON解析用于提取布尔/整数值

时间:2013-05-06 04:51:59

标签: android json flickr

我是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);
        }   
    }   

谢谢!

4 个答案:

答案 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)

我建议您尝试JacksonGson并将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并将属性保密。