ObjectArrayReaderMultiType.java
package com.alibaba.fastjson2.reader;
import com.alibaba.fastjson2.*;
import com.alibaba.fastjson2.util.MultiType;
import java.lang.reflect.Type;
import java.util.Collection;
final class ObjectArrayReaderMultiType
implements ObjectReader {
final Type[] types;
final ObjectReader[] readers;
ObjectArrayReaderMultiType(MultiType multiType) {
Type[] types = new Type[multiType.size()];
for (int i = 0; i < multiType.size(); i++) {
types[i] = multiType.getType(i);
}
this.types = types;
this.readers = new ObjectReader[types.length];
}
ObjectReader getObjectReader(JSONReader jsonReader, int index) {
ObjectReader objectReader = readers[index];
if (objectReader == null) {
Type type = types[index];
objectReader = jsonReader.getObjectReader(type);
readers[index] = objectReader;
}
return objectReader;
}
@Override
public Object readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
if (jsonReader.jsonb) {
return readJSONBObject(jsonReader, fieldType, fieldName, 0);
}
if (jsonReader.nextIfNullOrEmptyString()) {
return null;
}
Object[] values = new Object[types.length];
if (jsonReader.nextIfArrayStart()) {
for (int i = 0; ; ++i) {
if (jsonReader.nextIfArrayEnd()) {
break;
}
Object value;
if (jsonReader.isReference()) {
String reference = jsonReader.readReference();
if ("..".equals(reference)) {
value = values;
} else {
value = null;
jsonReader.addResolveTask(values, i, JSONPath.of(reference));
}
} else {
ObjectReader objectReader = getObjectReader(jsonReader, i);
value = objectReader.readObject(jsonReader, types[i], i, features);
}
values[i] = value;
jsonReader.nextIfComma();
}
jsonReader.nextIfComma();
return values;
}
throw new JSONException(jsonReader.info("TODO"));
}
@Override
public Object readJSONBObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
int entryCnt = jsonReader.startArray();
if (entryCnt == -1) {
return null;
}
Object[] values = new Object[types.length];
for (int i = 0; i < entryCnt; ++i) {
Object value;
if (jsonReader.isReference()) {
String reference = jsonReader.readReference();
if ("..".equals(reference)) {
value = values;
} else {
value = null;
jsonReader.addResolveTask(values, i, JSONPath.of(reference));
}
} else {
ObjectReader objectReader = getObjectReader(jsonReader, i);
value = objectReader.readObject(jsonReader, types[i], i, features);
}
values[i] = value;
}
return values;
}
@Override
public Object createInstance(Collection collection) {
return new Object[types.length];
}
}