in core/src/main/java/com/alibaba/fastjson2/JSONReader.java [2106:2307]
public void read(Map object, long features) {
if (ch == '\'' && ((context.features & Feature.DisableSingleQuote.mask) != 0)) {
throw notSupportName();
}
if ((ch == '"' || ch == '\'') && !typeRedirect) {
String str = readString();
if (str.isEmpty()) {
return;
}
if (str.charAt(0) == '{') {
try (JSONReader jsonReader = JSONReader.of(str, context)) {
jsonReader.readObject(object, features);
return;
}
}
}
boolean match = nextIfObjectStart();
boolean typeRedirect = false;
if (!match) {
if (typeRedirect = isTypeRedirect()) {
setTypeRedirect(false);
} else {
if (isString()) {
String str = readString();
if (str.isEmpty()) {
return;
}
}
throw new JSONException(info());
}
}
Map map;
if (object instanceof Wrapper) {
map = ((Wrapper) object).unwrap(Map.class);
} else {
map = object;
}
long contextFeatures = features | context.getFeatures();
for (int i = 0; ; ++i) {
if (ch == '/') {
skipComment();
}
if (nextIfObjectEnd()) {
break;
}
if (i != 0 && !comma) {
throw new JSONException(info());
}
Object name;
if (match || typeRedirect) {
if ((ch >= '0' && ch <= '9') || ch == '-') {
name = null;
} else {
name = readFieldName();
}
} else {
name = getFieldName();
match = true;
}
if (name == null) {
if (isNumber()) {
name = readNumber();
if ((context.features & Feature.NonStringKeyAsString.mask) != 0) {
name = name.toString();
}
if (comma) {
throw new JSONException(info("syntax error, illegal key-value"));
}
} else {
if ((context.features & Feature.AllowUnQuotedFieldNames.mask) != 0) {
name = readFieldNameUnquote();
} else {
throw new JSONException(info("not allow unquoted fieldName"));
}
}
if (ch == ':') {
next();
}
}
if (isReference()) {
String reference = readReference();
Object value = null;
if ("..".equals(reference)) {
value = map;
} else {
JSONPath jsonPath;
try {
jsonPath = JSONPath.of(reference);
} catch (Exception ignored) {
map.put(name, JSONObject.of("$ref", reference));
continue;
}
addResolveTask(map, name, jsonPath);
}
map.put(name, value);
continue;
}
comma = false;
Object value;
switch (ch) {
case '-':
case '+':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
value = readNumber();
break;
case '[':
value = readArray();
break;
case '{':
if (typeRedirect) {
value = ObjectReaderImplObject.INSTANCE.readObject(this, null, name, features);
} else {
value = readObject();
}
break;
case '"':
case '\'':
value = readString();
break;
case 't':
case 'f':
value = readBoolValue();
break;
case 'n':
value = readNullOrNewDate();
break;
case '/':
next();
if (ch == '/') {
skipComment();
} else {
throw new JSONException("FASTJSON" + JSON.VERSION + "input not support " + ch + ", offset " + offset);
}
continue;
case 'S':
if (nextIfSet()) {
value = read(HashSet.class);
} else {
throw new JSONException("FASTJSON" + JSON.VERSION + "error, offset " + offset + ", char " + ch);
}
break;
case 'I':
if (nextIfInfinity()) {
value = Double.POSITIVE_INFINITY;
} else {
throw new JSONException("FASTJSON" + JSON.VERSION + "error, offset " + offset + ", char " + ch);
}
break;
case 'x':
value = readBinary();
break;
default:
throw new JSONException("FASTJSON" + JSON.VERSION + "error, offset " + offset + ", char " + ch);
}
if (value == null && (contextFeatures & Feature.IgnoreNullPropertyValue.mask) != 0) {
continue;
}
if ((contextFeatures & Feature.SupportAutoType.mask) != 0
&& name.equals("@type")
&& object.getClass().getName().equals(value)
) {
continue;
}
Object origin = map.put(name, value);
if (origin != null) {
if ((contextFeatures & Feature.DuplicateKeyValueAsArray.mask) != 0) {
if (origin instanceof Collection) {
((Collection) origin).add(value);
map.put(name, origin);
} else {
JSONArray array = JSONArray.of(origin, value);
map.put(name, array);
}
}
}
}
nextIfComma();
}