【问题标题】:JSON Parsing in Android for pulling Boolean/Integer valuesAndroid 中用于提取布尔/整数值的 JSON 解析
【发布时间】:2013-04-29 19:40:09
【问题描述】:

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

谢谢!

【问题讨论】:

  • 您是否尝试过任何建议的答案?您真的不应该提出问题,也不应该提供反馈和/或尝试建议的答案。

标签: android json flickr


【解决方案1】:
JSONObject jobj = result.getJSONObject("photo");
jobj.getBoolean("ispublic");
jobj.getInt("isfriend");

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

【讨论】:

    【解决方案2】:

    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 解析,所以我不会给出太多例子,但如果你对我的回答有其他问题,请随时在评论中提问:)

    【讨论】:

    • 我没有尝试将其转换为布尔值,它需要是一个字符串,以便我可以将多个值放入一个字符串,然后放入一个 URL 以下载图像。
    • @DDukesterman 啊抱歉我误解了你的问题,所以问题出在解析上?我想还有其他人已经给出了另一个答案,如果他们的答案不起作用,请先尝试他们的答案,我会编辑我的答案:)
    【解决方案3】:

    我们假设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;
            }
    

    【讨论】:

      【解决方案4】:

      我建议您尝试JacksonGson 并将JSON 转换为POJOs。我发现使用 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 并将属性保密。

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2014-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        相关资源
        最近更新 更多