package com.alibaba.fastjson.parser.deserializer;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.JSONToken;
public class ArrayListStringDeserializer implements ObjectDeserializer {
public final static ArrayListStringDeserializer instance = new ArrayListStringDeserializer();
@SuppressWarnings({"unchecked", "rawtypes"})
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
final JSONLexer lexer = parser.getLexer();
if (lexer.token() == JSONToken.NULL) {
lexer.nextToken(JSONToken.COMMA);
return null;
}
Collection array = null;
if (type == Set.class || type == HashSet.class) {
array = new HashSet();
} else {
if (type instanceof ParameterizedType) {
Type rawType = ((ParameterizedType) type).getRawType();
if (rawType == Set.class || rawType == HashSet.class) {
array = new HashSet();
}
}
}
if (array == null) {
array = new ArrayList();
}
parseArray(parser, array);
return (T) array;
}
@SuppressWarnings({"rawtypes", "unchecked"})
public static void parseArray(DefaultJSONParser parser, Collection array) {
JSONLexer lexer = parser.getLexer();
if (lexer.token() == JSONToken.NULL) {
lexer.nextToken(JSONToken.COMMA);
return;
}
if (lexer.token() == JSONToken.SET) {
lexer.nextToken();
}
if (lexer.token() != JSONToken.LBRACKET) {
throw new JSONException("exepct '[', but " + lexer.token());
}
lexer.nextToken(JSONToken.LITERAL_STRING);
for (;;) {
if (lexer.isEnabled(Feature.AllowArbitraryCommas)) {
while (lexer.token() == JSONToken.COMMA) {
lexer.nextToken();
continue;
}
}
if (lexer.token() == JSONToken.RBRACKET) {
break;
}
String value;
if (lexer.token() == JSONToken.LITERAL_STRING) {
value = lexer.stringVal();
lexer.nextToken(JSONToken.COMMA);
} else {
Object obj = parser.parse();
if (obj == null) {
value = null;
} else {
value = obj.toString();
}
}
array.add(value);
if (lexer.token() == JSONToken.COMMA) {
lexer.nextToken(JSONToken.LITERAL_STRING);
continue;
}
}
lexer.nextToken(JSONToken.COMMA);
}
public int getFastMatchToken() {
return JSONToken.LBRACKET;
}
}