0

我是 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 值。我让它下载 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

4 回答 4

2
JSONObject jobj = result.getJSONObject("photo");
jobj.getBoolean("ispublic");
jobj.getInt("isfriend");

该变量result的类型JsonObject应包含上面粘贴在代码中的整个对象

于 2013-05-06T05:02:32.830 回答
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 解析,所以我不会给出太多示例,但是如果您对我的回答有其他问题,请随时在评论中提问:)

于 2013-05-06T04:55:36.223 回答
0

我建议您尝试使用JacksonGson并将 JSON 转换为一些POJO。我发现使用 java 对象而不是 JSONObject、JSONArray 等更容易,更不容易出错。这是一个使用杰克逊如何工作的例子。首先,我们创建映射到 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;
}

一旦我们创建了我们的 pojo,我们就可以使用 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 并保持属性私有。

于 2013-05-06T05:18:43.463 回答
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;
        }
于 2013-05-06T05:00:03.650 回答