美文网首页
JSONObject(map)的坑

JSONObject(map)的坑

作者: _蘇芳_ | 来源:发表于2018-07-13 17:21 被阅读412次
    1. bug出现:在一个EditText中输入文字,拿到输入的文字view.text.trim(),存入map,继而使用了JSONObject(map)之后,JSONObject.toString()发现存进去个“null”。

    2. bug原因:debug后发现view.text.trim()存进map的是个SpannableStringBuilder
      JSONObject的构造是

     public JSONObject(Map copyFrom) {
            this();
            Map<?, ?> contentsTyped = (Map<?, ?>) copyFrom;
            for (Map.Entry<?, ?> entry : contentsTyped.entrySet()) {
                /*
                 * Deviate from the original by checking that keys are non-null and
                 * of the proper type. (We still defer validating the values).
                 */
                String key = (String) entry.getKey();
                if (key == null) {
                    throw new NullPointerException("key == null");
                }
                nameValuePairs.put(key, wrap(entry.getValue()));
            }
        }
    

    遍历map,存起来。但是注意,并不是直接存entry.getValue()的。而是进行了wrap包裹,那么包裹了啥呢?

    public static Object wrap(Object o) {
            if (o == null) {
                return NULL;
            }
            if (o instanceof JSONArray || o instanceof JSONObject) {
                return o;
            }
            if (o.equals(NULL)) {
                return o;
            }
            try {
                if (o instanceof Collection) {
                    return new JSONArray((Collection) o);
                } else if (o.getClass().isArray()) {
                    return new JSONArray(o);
                }
                if (o instanceof Map) {
                    return new JSONObject((Map) o);
                }
                if (o instanceof Boolean ||
                    o instanceof Byte ||
                    o instanceof Character ||
                    o instanceof Double ||
                    o instanceof Float ||
                    o instanceof Integer ||
                    o instanceof Long ||
                    o instanceof Short ||
                    o instanceof String) {
                    return o;
                }
                if (o.getClass().getPackage().getName().startsWith("java.")) {
                    return o.toString();
                }
            } catch (Exception ignored) {
            }
            return null;
        }
    

    NULL是个Object,可以看成就是个“null”
    这个wrap()nullJSONArrayJSONObject、集合以及各种基本类型进行了处理,但是不能处理SpannableStringBuilder啊~

    1. bug解决
      在获取到EditText的内容的时候 还是view.text.toString().trim()

    相关文章

      网友评论

          本文标题:JSONObject(map)的坑

          本文链接:https://www.haomeiwen.com/subject/nyrspftx.html