in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonParserSession.java [273:394]
private <T> T parseAnything(ClassMeta<?> eType, ParserReader r, Object outer, BeanPropertyMeta pMeta) throws IOException, ParseException, ExecutableException {
if (eType == null)
eType = object();
ObjectSwap<T,Object> swap = (ObjectSwap<T,Object>)eType.getSwap(this);
BuilderSwap<T,Object> builder = (BuilderSwap<T,Object>)eType.getBuilderSwap(this);
ClassMeta<?> sType = null;
if (builder != null)
sType = builder.getBuilderClassMeta(this);
else if (swap != null)
sType = swap.getSwapClassMeta(this);
else
sType = eType;
if (sType.isOptional())
return (T)optional(parseAnything(eType.getElementType(), r, outer, pMeta));
setCurrentClass(sType);
String wrapperAttr = getJsonClassMeta(sType).getWrapperAttr();
Object o = null;
skipCommentsAndSpace(r);
if (wrapperAttr != null)
skipWrapperAttrStart(r, wrapperAttr);
int c = r.peek();
if (c == -1) {
if (isStrict())
throw new ParseException(this, "Empty input.");
// Let o be null.
} else if ((c == ',' || c == '}' || c == ']')) {
if (isStrict())
throw new ParseException(this, "Missing value detected.");
// Handle bug in Cognos 10.2.1 that can product non-existent values.
// Let o be null;
} else if (c == 'n') {
parseKeyword("null", r);
} else if (sType.isObject()) {
if (c == '{') {
JsonMap m2 = new JsonMap(this);
parseIntoMap2(r, m2, string(), object(), pMeta);
o = cast(m2, pMeta, eType);
} else if (c == '[') {
o = parseIntoCollection2(r, new JsonList(this), object(), pMeta);
} else if (c == '\'' || c == '"') {
o = parseString(r);
if (sType.isChar())
o = parseCharacter(o);
} else if (c >= '0' && c <= '9' || c == '-' || c == '.') {
o = parseNumber(r, null);
} else if (c == 't') {
parseKeyword("true", r);
o = Boolean.TRUE;
} else {
parseKeyword("false", r);
o = Boolean.FALSE;
}
} else if (sType.isBoolean()) {
o = parseBoolean(r);
} else if (sType.isCharSequence()) {
o = parseString(r);
} else if (sType.isChar()) {
o = parseCharacter(parseString(r));
} else if (sType.isNumber()) {
o = parseNumber(r, (Class<? extends Number>)sType.getInnerClass());
} else if (sType.isMap()) {
Map m = (sType.canCreateNewInstance(outer) ? (Map)sType.newInstance(outer) : newGenericMap(sType));
o = parseIntoMap2(r, m, sType.getKeyType(), sType.getValueType(), pMeta);
} else if (sType.isCollection()) {
if (c == '{') {
JsonMap m = new JsonMap(this);
parseIntoMap2(r, m, string(), object(), pMeta);
o = cast(m, pMeta, eType);
} else {
Collection l = (sType.canCreateNewInstance(outer) ? (Collection)sType.newInstance() : new JsonList(this));
o = parseIntoCollection2(r, l, sType, pMeta);
}
} else if (builder != null) {
BeanMap m = toBeanMap(builder.create(this, eType));
o = builder.build(this, parseIntoBeanMap2(r, m).getBean(), eType);
} else if (sType.canCreateNewBean(outer)) {
BeanMap m = newBeanMap(outer, sType.getInnerClass());
o = parseIntoBeanMap2(r, m).getBean();
} else if (sType.canCreateNewInstanceFromString(outer) && (c == '\'' || c == '"')) {
o = sType.newInstanceFromString(outer, parseString(r));
} else if (sType.isArray() || sType.isArgs()) {
if (c == '{') {
JsonMap m = new JsonMap(this);
parseIntoMap2(r, m, string(), object(), pMeta);
o = cast(m, pMeta, eType);
} else {
ArrayList l = (ArrayList)parseIntoCollection2(r, list(), sType, pMeta);
o = toArray(sType, l);
}
} else if (c == '{') {
Map m = new JsonMap(this);
parseIntoMap2(r, m, sType.getKeyType(), sType.getValueType(), pMeta);
if (m.containsKey(getBeanTypePropertyName(eType)))
o = cast((JsonMap)m, pMeta, eType);
else if (sType.getProxyInvocationHandler() != null)
o = newBeanMap(outer, sType.getInnerClass()).load(m).getBean();
else
throw new ParseException(this, "Class ''{0}'' could not be instantiated. Reason: ''{1}''",
sType.getInnerClass().getName(), sType.getNotABeanReason());
} else if (sType.canCreateNewInstanceFromString(outer) && ! isStrict()) {
o = sType.newInstanceFromString(outer, parseString(r));
} else {
throw new ParseException(this, "Unrecognized syntax for class type ''{0}'', starting character ''{1}''",
sType, (char)c);
}
if (wrapperAttr != null)
skipWrapperAttrEnd(r);
if (swap != null && o != null)
o = unswap(swap, o, eType);
if (outer != null)
setParent(eType, o, outer);
return (T)o;
}