【问题标题】:Convert JSON to Android Bundle [closed]将 JSON 转换为 Android Bundle [关闭]
【发布时间】:2015-03-11 10:57:55
【问题描述】:

我想将 JSON 字符串转换为 android Bundle。要求就像将参数直接从服务器作为 JSON 传递给活动,而不是捆绑。如何将 JSON 字符串转换为 Android Bundle?如果可能,请提供抽象代码。

【问题讨论】:

    标签: java android json bundle adt


    【解决方案1】:
    public static Bundle jsonStringToBundle(String jsonString){
        try {
            JSONObject jsonObject = toJsonObject(jsonString);
            return jsonToBundle(jsonObject);
        } catch (JSONException ignored) {
    
        }
        return null;
    }
    public static JSONObject toJsonObject(String jsonString) throws JSONException {
        return new JSONObject(jsonString);
    }
    public static Bundle jsonToBundle(JSONObject jsonObject) throws JSONException {
        Bundle bundle = new Bundle();
        Iterator iter = jsonObject.keys();
        while(iter.hasNext()){
            String key = (String)iter.next();
            String value = jsonObject.getString(key);
            bundle.putString(key,value);
        }
        return bundle;
    }
    

    【讨论】:

      【解决方案2】:

      这已经很晚了,但也许它可以帮助某人找到这个帖子:

      /** Convert a JSON object to a Bundle that can be passed as the extras of                                          
       * an Intent. It passes each number as a double, and everything else as a                                          
       * String, arrays of those two are also supported. */                                                              
      public static Bundle fromJson(JSONObject s) {                                                                      
          Bundle bundle = new Bundle();                                                                                  
      
          for (Iterator<String> it = s.keys(); it.hasNext(); ) {                                                         
              String key = it.next();                                                                                    
              JSONArray arr = s.optJSONArray(key);                                                                       
              Double num = s.optDouble(key);                                                                             
              String str = s.optString(key);                                                                             
      
              if (arr != null && arr.length() <= 0)                                                                      
                  bundle.putStringArray(key, new String[]{});                                                            
      
              else if (arr != null && !Double.isNaN(arr.optDouble(0))) {                                                 
                  double[] newarr = new double[arr.length()];                                                            
                  for (int i=0; i<arr.length(); i++)                                                                     
                      newarr[i] = arr.optDouble(i);                                                                      
                  bundle.putDoubleArray(key, newarr);                                                                    
              }                                                                                                          
      
              else if (arr != null && arr.optString(0) != null) {                                                        
                  String[] newarr = new String[arr.length()];                                                            
                  for (int i=0; i<arr.length(); i++)                                                                     
                      newarr[i] = arr.optString(i);                                                                      
                  bundle.putStringArray(key, newarr);                                                                    
              }                                                                                                          
      
              else if (!num.isNaN())                                                                                     
                  bundle.putDouble(key, num);                                                                            
      
              else if (str != null)                                                                                      
                  bundle.putString(key, str);                                                                            
      
              else                                                                                                       
                  System.err.println("unable to transform json to bundle " + key);                                       
          }                                                                                                              
      
          return bundle;                                                                                                 
      }      
      

      【讨论】:

        【解决方案3】:

        jaffa 的回答很好,但它仅适用于 depth=1 JSON 对象。我通过添加对嵌套对象的支持对其进行了改进。

        private static Bundle jsonStringToBundle(String jsonString) {
            try {
                JSONObject jsonObject = new JSONObject(jsonString);
                return jsonToBundle(jsonObject);
            } catch (JSONException ignored) {}
        
            return null;
        }
        
        private static Bundle jsonToBundle(JSONObject jsonObject) throws JSONException {
            Bundle bundle = new Bundle();
            Iterator iter = jsonObject.keys();
        
            while (iter.hasNext()) {
                String key = (String)iter.next();
                String value = jsonObject.getString(key);
                Bundle bundleVal = jsonStringToBundle(value);
        
                if (bundleVal != null) {
                    bundle.putBundle(key, bundleVal);
                } else {
                    bundle.putString(key, value);
                }
            }
        
            return bundle;
        }
        

        用法:

        Bundle bundle = jsonStringToBundle("{...}");
        

        【讨论】:

          【解决方案4】:

          只是一个快速的SSCCEE

          A.class

          // key for bundle ...
          public static final JSON_STRING = "jsonString";
          
          Intent intent = new Intent(A.this, B.class);
          Bundle bundle = new Bundle();
          bundle.putString(JSON_STRING,json.toString());
          intent.putExtras(bundle);
          startActivity(intent);
          

          然后在 B.class ...

          Intent intent = getIntent();
          Bundle extras = intent.getExtras();
          String jsonString = extras.getString(A.JSON_STRING);
          

          more info about json and java

          【讨论】:

          • 我的意思是 JSON 对象到捆绑对象。
          • 这没有回答问题。
          猜你喜欢
          • 1970-01-01
          • 2014-01-08
          • 2011-10-08
          • 2012-12-25
          • 1970-01-01
          • 2016-09-24
          • 2010-10-14
          • 1970-01-01
          相关资源
          最近更新 更多