一、JSONObject初始化调用流程
public JSONObject(String json) throws JSONException {
this(new JSONTokener(json));
}
public JSONObject(JSONTokener readFrom) throws JSONException {
Object object = readFrom.nextValue();
......
}
进而调用到JSONTokener的方法:
public Object nextValue() throws JSONException {
int c = nextCleanInternal();
switch (c) {
case -1:
throw syntaxError("End of input");
case '{':
return readObject();
case '[':
return readArray();
case '\'':
case '"':
return nextString((char) c);
default:
pos--;
return readLiteral();
}
}
分析方法readObject()中的 JSONObject.put((String) name, nextValue())
1、nextValue()当读取到null的值时,会进入方法readLiteral()
private Object readLiteral() throws JSONException {
String literal = nextToInternal("{}[]/\\:,=;# \t\f");
if (literal.length() == 0) {
throw syntaxError("Expected literal value");
} else if ("null".equalsIgnoreCase(literal)) {
return JSONObject.NULL;
......
nextToInternal(“{}[]/\:,=;# \t\f”)方法通过in.substring(start, pos)截取到null作为字符串,返回NULL对象
2、 JSONObject.put()实现方法如下:
public JSONObject put(String name, Object value) throws JSONException {
if (value == null) {
nameValuePairs.remove(name);
return this;
}
if (value instanceof Number) {
// deviate from the original by checking all Numbers, not just floats & doubles
JSON.checkDouble(((Number) value).doubleValue());
}
nameValuePairs.put(checkName(name), value);
return this;
}
此时将NULL对象放入到了对象
LinkedHashMap<String,Object> nameValuePairs
二、JSONObject.optString(“key”)去获取值
public String optString(String name, String fallback) {
Object object = opt(name);
String result = JSON.toString(object);
return result != null ? result : fallback;
}
调用JSONObject的opt方法,从LinkedHashMap nameValuePairs中获取Object,
public Object opt(String name) {
return nameValuePairs.get(name);
}
关键点在String result = JSON.toString(object),其实现方法:
static String toString(Object value) {
if (value instanceof String) {
return (String) value;
} else if (value != null) {
return String.valueOf(value);
}
return null;
}
只要Object不为null,则强转为String对象,Object对象的定义
public static final Object NULL = new Object() {
@Override public boolean equals(Object o) {
return o == this || o == null; // API specifies this broken equals implementation
}
@Override public String toString() {
return "null";
}
};
故返回String对象
三、修改获取方法:JSONObject.isNull(“key”)?“”:JSONObject.optString(“key”)
public boolean isNull(String name) {
Object value = nameValuePairs.get(name);
return value == null || value == NULL;
}
返回true的场景:
1、key==null
2、value == NULL(即格式为“key”:null)