1. bug出现:在一个EditText中输入文字,拿到输入的文字view.text.trim(),存入map,继而使用了JSONObject(map)之后,JSONObject.toString()发现存进去个“null”。
  1. bug原因:debug后发现view.text.trim()存进map的是个SpannableStringBuilder
    JSONObject的构造是
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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包裹,那么包裹了啥呢?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    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啊~
  2. bug解决
    在获取到EditText的内容的时候 还是view.text.toString().trim()