JSONObject(map)的坑
- bug出现:在一个EditText中输入文字,拿到输入的文字
view.text.trim()
,存入map,继而使用了JSONObject(map)
之后,JSONObject.toString()
发现存进去个“null”。
- bug原因:debug后发现
view.text.trim()
存进map的是个SpannableStringBuilder
,
JSONObject的构造是遍历map,存起来。但是注意,并不是直接存1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public 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()));
}
}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
37public 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()
对null
、JSONArray
、JSONObject
、集合以及各种基本类型进行了处理,但是不能处理SpannableStringBuilder
啊~ - bug解决
在获取到EditText的内容的时候 还是view.text.toString().trim()
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 七夜的小屋!