Search in sources :

Example 16 with ObjectDeserializer

use of com.alibaba.fastjson.parser.deserializer.ObjectDeserializer in project fastjson by alibaba.

the class DefaultJSONParser method parseObject.

@SuppressWarnings({ "unchecked", "rawtypes" })
public final Object parseObject(final Map object, Object fieldName) {
    final JSONLexer lexer = this.lexer;
    if (lexer.token() == JSONToken.NULL) {
        lexer.nextToken();
        return null;
    }
    if (lexer.token() == JSONToken.RBRACE) {
        lexer.nextToken();
        return object;
    }
    if (lexer.token() != JSONToken.LBRACE && lexer.token() != JSONToken.COMMA) {
        throw new JSONException("syntax error, expect {, actual " + lexer.tokenName() + ", " + lexer.info());
    }
    ParseContext context = this.context;
    try {
        boolean setContextFlag = false;
        for (; ; ) {
            lexer.skipWhitespace();
            char ch = lexer.getCurrent();
            if (lexer.isEnabled(Feature.AllowArbitraryCommas)) {
                while (ch == ',') {
                    lexer.next();
                    lexer.skipWhitespace();
                    ch = lexer.getCurrent();
                }
            }
            boolean isObjectKey = false;
            Object key;
            if (ch == '"') {
                key = lexer.scanSymbol(symbolTable, '"');
                lexer.skipWhitespace();
                ch = lexer.getCurrent();
                if (ch != ':') {
                    throw new JSONException("expect ':' at " + lexer.pos() + ", name " + key);
                }
            } else if (ch == '}') {
                lexer.next();
                lexer.resetStringPosition();
                lexer.nextToken();
                if (!setContextFlag) {
                    if (this.context != null && fieldName == this.context.fieldName && object == this.context.object) {
                        context = this.context;
                    } else {
                        ParseContext contextR = setContext(object, fieldName);
                        if (context == null) {
                            context = contextR;
                        }
                        setContextFlag = true;
                    }
                }
                return object;
            } else if (ch == '\'') {
                if (!lexer.isEnabled(Feature.AllowSingleQuotes)) {
                    throw new JSONException("syntax error");
                }
                key = lexer.scanSymbol(symbolTable, '\'');
                lexer.skipWhitespace();
                ch = lexer.getCurrent();
                if (ch != ':') {
                    throw new JSONException("expect ':' at " + lexer.pos());
                }
            } else if (ch == EOI) {
                throw new JSONException("syntax error");
            } else if (ch == ',') {
                throw new JSONException("syntax error");
            } else if ((ch >= '0' && ch <= '9') || ch == '-') {
                lexer.resetStringPosition();
                lexer.scanNumber();
                try {
                    if (lexer.token() == JSONToken.LITERAL_INT) {
                        key = lexer.integerValue();
                    } else {
                        key = lexer.decimalValue(true);
                    }
                } catch (NumberFormatException e) {
                    throw new JSONException("parse number key error" + lexer.info());
                }
                ch = lexer.getCurrent();
                if (ch != ':') {
                    throw new JSONException("parse number key error" + lexer.info());
                }
            } else if (ch == '{' || ch == '[') {
                lexer.nextToken();
                key = parse();
                isObjectKey = true;
            } else {
                if (!lexer.isEnabled(Feature.AllowUnQuotedFieldNames)) {
                    throw new JSONException("syntax error");
                }
                key = lexer.scanSymbolUnQuoted(symbolTable);
                lexer.skipWhitespace();
                ch = lexer.getCurrent();
                if (ch != ':') {
                    throw new JSONException("expect ':' at " + lexer.pos() + ", actual " + ch);
                }
            }
            if (!isObjectKey) {
                lexer.next();
                lexer.skipWhitespace();
            }
            ch = lexer.getCurrent();
            lexer.resetStringPosition();
            if (key == JSON.DEFAULT_TYPE_KEY && !lexer.isEnabled(Feature.DisableSpecialKeyDetect)) {
                String typeName = lexer.scanSymbol(symbolTable, '"');
                Class<?> clazz = config.checkAutoType(typeName, null);
                if (clazz == null) {
                    object.put(JSON.DEFAULT_TYPE_KEY, typeName);
                    continue;
                }
                lexer.nextToken(JSONToken.COMMA);
                if (lexer.token() == JSONToken.RBRACE) {
                    lexer.nextToken(JSONToken.COMMA);
                    try {
                        Object instance = null;
                        ObjectDeserializer deserializer = this.config.getDeserializer(clazz);
                        if (deserializer instanceof JavaBeanDeserializer) {
                            instance = ((JavaBeanDeserializer) deserializer).createInstance(this, clazz);
                        }
                        if (instance == null) {
                            if (clazz == Cloneable.class) {
                                instance = new HashMap();
                            } else if ("java.util.Collections$EmptyMap".equals(typeName)) {
                                instance = Collections.emptyMap();
                            } else {
                                instance = clazz.newInstance();
                            }
                        }
                        return instance;
                    } catch (Exception e) {
                        throw new JSONException("create instance error", e);
                    }
                }
                this.setResolveStatus(TypeNameRedirect);
                if (this.context != null && !(fieldName instanceof Integer) && !(this.context.fieldName instanceof Integer)) {
                    this.popContext();
                }
                if (object.size() > 0) {
                    Object newObj = TypeUtils.cast(object, clazz, this.config);
                    this.parseObject(newObj);
                    return newObj;
                }
                ObjectDeserializer deserializer = config.getDeserializer(clazz);
                return deserializer.deserialze(this, clazz, fieldName);
            }
            if (key == "$ref" && !lexer.isEnabled(Feature.DisableSpecialKeyDetect)) {
                lexer.nextToken(JSONToken.LITERAL_STRING);
                if (lexer.token() == JSONToken.LITERAL_STRING) {
                    String ref = lexer.stringVal();
                    lexer.nextToken(JSONToken.RBRACE);
                    Object refValue = null;
                    if ("@".equals(ref)) {
                        if (this.context != null) {
                            ParseContext thisContext = this.context;
                            Object thisObj = thisContext.object;
                            if (thisObj instanceof Object[] || thisObj instanceof Collection<?>) {
                                refValue = thisObj;
                            } else if (thisContext.parent != null) {
                                refValue = thisContext.parent.object;
                            }
                        }
                    } else if ("..".equals(ref)) {
                        if (context.object != null) {
                            refValue = context.object;
                        } else {
                            addResolveTask(new ResolveTask(context, ref));
                            setResolveStatus(DefaultJSONParser.NeedToResolve);
                        }
                    } else if ("$".equals(ref)) {
                        ParseContext rootContext = context;
                        while (rootContext.parent != null) {
                            rootContext = rootContext.parent;
                        }
                        if (rootContext.object != null) {
                            refValue = rootContext.object;
                        } else {
                            addResolveTask(new ResolveTask(rootContext, ref));
                            setResolveStatus(DefaultJSONParser.NeedToResolve);
                        }
                    } else {
                        addResolveTask(new ResolveTask(context, ref));
                        setResolveStatus(DefaultJSONParser.NeedToResolve);
                    }
                    if (lexer.token() != JSONToken.RBRACE) {
                        throw new JSONException("syntax error");
                    }
                    lexer.nextToken(JSONToken.COMMA);
                    return refValue;
                } else {
                    throw new JSONException("illegal ref, " + JSONToken.name(lexer.token()));
                }
            }
            if (!setContextFlag) {
                if (this.context != null && fieldName == this.context.fieldName && object == this.context.object) {
                    context = this.context;
                } else {
                    ParseContext contextR = setContext(object, fieldName);
                    if (context == null) {
                        context = contextR;
                    }
                    setContextFlag = true;
                }
            }
            if (object.getClass() == JSONObject.class) {
                key = (key == null) ? "null" : key.toString();
            }
            Object value;
            if (ch == '"') {
                lexer.scanString();
                String strValue = lexer.stringVal();
                value = strValue;
                if (lexer.isEnabled(Feature.AllowISO8601DateFormat)) {
                    JSONScanner iso8601Lexer = new JSONScanner(strValue);
                    if (iso8601Lexer.scanISO8601DateIfMatch()) {
                        value = iso8601Lexer.getCalendar().getTime();
                    }
                    iso8601Lexer.close();
                }
                object.put(key, value);
            } else if (ch >= '0' && ch <= '9' || ch == '-') {
                lexer.scanNumber();
                if (lexer.token() == JSONToken.LITERAL_INT) {
                    value = lexer.integerValue();
                } else {
                    value = lexer.decimalValue(lexer.isEnabled(Feature.UseBigDecimal));
                }
                object.put(key, value);
            } else if (ch == '[') {
                // 减少嵌套,兼容android
                lexer.nextToken();
                JSONArray list = new JSONArray();
                final boolean parentIsArray = fieldName != null && fieldName.getClass() == Integer.class;
                //                    }
                if (fieldName == null) {
                    this.setContext(context);
                }
                this.parseArray(list, key);
                if (lexer.isEnabled(Feature.UseObjectArray)) {
                    value = list.toArray();
                } else {
                    value = list;
                }
                object.put(key, value);
                if (lexer.token() == JSONToken.RBRACE) {
                    lexer.nextToken();
                    return object;
                } else if (lexer.token() == JSONToken.COMMA) {
                    continue;
                } else {
                    throw new JSONException("syntax error");
                }
            } else if (ch == '{') {
                // 减少嵌套,兼容android
                lexer.nextToken();
                final boolean parentIsArray = fieldName != null && fieldName.getClass() == Integer.class;
                JSONObject input = new JSONObject(lexer.isEnabled(Feature.OrderedField));
                ParseContext ctxLocal = null;
                if (!parentIsArray) {
                    ctxLocal = setContext(context, input, key);
                }
                Object obj = null;
                boolean objParsed = false;
                if (fieldTypeResolver != null) {
                    String resolveFieldName = key != null ? key.toString() : null;
                    Type fieldType = fieldTypeResolver.resolve(object, resolveFieldName);
                    if (fieldType != null) {
                        ObjectDeserializer fieldDeser = config.getDeserializer(fieldType);
                        obj = fieldDeser.deserialze(this, fieldType, key);
                        objParsed = true;
                    }
                }
                if (!objParsed) {
                    obj = this.parseObject(input, key);
                }
                if (ctxLocal != null && input != obj) {
                    ctxLocal.object = object;
                }
                checkMapResolve(object, key.toString());
                if (object.getClass() == JSONObject.class) {
                    object.put(key.toString(), obj);
                } else {
                    object.put(key, obj);
                }
                if (parentIsArray) {
                    //setContext(context, obj, key);
                    setContext(obj, key);
                }
                if (lexer.token() == JSONToken.RBRACE) {
                    lexer.nextToken();
                    setContext(context);
                    return object;
                } else if (lexer.token() == JSONToken.COMMA) {
                    if (parentIsArray) {
                        this.popContext();
                    } else {
                        this.setContext(context);
                    }
                    continue;
                } else {
                    throw new JSONException("syntax error, " + lexer.tokenName());
                }
            } else {
                lexer.nextToken();
                value = parse();
                if (object.getClass() == JSONObject.class) {
                    key = key.toString();
                }
                object.put(key, value);
                if (lexer.token() == JSONToken.RBRACE) {
                    lexer.nextToken();
                    return object;
                } else if (lexer.token() == JSONToken.COMMA) {
                    continue;
                } else {
                    throw new JSONException("syntax error, position at " + lexer.pos() + ", name " + key);
                }
            }
            lexer.skipWhitespace();
            ch = lexer.getCurrent();
            if (ch == ',') {
                lexer.next();
                continue;
            } else if (ch == '}') {
                lexer.next();
                lexer.resetStringPosition();
                lexer.nextToken();
                // this.setContext(object, fieldName);
                this.setContext(value, key);
                return object;
            } else {
                throw new JSONException("syntax error, position at " + lexer.pos() + ", name " + key);
            }
        }
    } finally {
        this.setContext(context);
    }
}
Also used : HashMap(java.util.HashMap) BigInteger(java.math.BigInteger) WildcardType(java.lang.reflect.WildcardType) ParameterizedType(java.lang.reflect.ParameterizedType) Type(java.lang.reflect.Type) ObjectDeserializer(com.alibaba.fastjson.parser.deserializer.ObjectDeserializer) JavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer)

Example 17 with ObjectDeserializer

use of com.alibaba.fastjson.parser.deserializer.ObjectDeserializer in project fastjson by alibaba.

the class DefaultJSONParser method parseArray.

@SuppressWarnings({ "unchecked", "rawtypes" })
public void parseArray(Type type, Collection array, Object fieldName) {
    if (lexer.token() == JSONToken.SET || lexer.token() == JSONToken.TREE_SET) {
        lexer.nextToken();
    }
    if (lexer.token() != JSONToken.LBRACKET) {
        throw new JSONException("exepct '[', but " + JSONToken.name(lexer.token()) + ", " + lexer.info());
    }
    ObjectDeserializer deserializer = null;
    if (int.class == type) {
        deserializer = IntegerCodec.instance;
        lexer.nextToken(JSONToken.LITERAL_INT);
    } else if (String.class == type) {
        deserializer = StringCodec.instance;
        lexer.nextToken(JSONToken.LITERAL_STRING);
    } else {
        deserializer = config.getDeserializer(type);
        lexer.nextToken(deserializer.getFastMatchToken());
    }
    ParseContext context = this.context;
    this.setContext(array, fieldName);
    try {
        for (int i = 0; ; ++i) {
            if (lexer.isEnabled(Feature.AllowArbitraryCommas)) {
                while (lexer.token() == JSONToken.COMMA) {
                    lexer.nextToken();
                    continue;
                }
            }
            if (lexer.token() == JSONToken.RBRACKET) {
                break;
            }
            if (int.class == type) {
                Object val = IntegerCodec.instance.deserialze(this, null, null);
                array.add(val);
            } else if (String.class == type) {
                String value;
                if (lexer.token() == JSONToken.LITERAL_STRING) {
                    value = lexer.stringVal();
                    lexer.nextToken(JSONToken.COMMA);
                } else {
                    Object obj = this.parse();
                    if (obj == null) {
                        value = null;
                    } else {
                        value = obj.toString();
                    }
                }
                array.add(value);
            } else {
                Object val;
                if (lexer.token() == JSONToken.NULL) {
                    lexer.nextToken();
                    val = null;
                } else {
                    val = deserializer.deserialze(this, type, i);
                }
                array.add(val);
                checkListResolve(array);
            }
            if (lexer.token() == JSONToken.COMMA) {
                lexer.nextToken(deserializer.getFastMatchToken());
                continue;
            }
        }
    } finally {
        this.setContext(context);
    }
    lexer.nextToken(JSONToken.COMMA);
}
Also used : ObjectDeserializer(com.alibaba.fastjson.parser.deserializer.ObjectDeserializer)

Example 18 with ObjectDeserializer

use of com.alibaba.fastjson.parser.deserializer.ObjectDeserializer in project uavstack by uavorg.

the class JSONPath method setPropertyValue.

@SuppressWarnings({ "unchecked", "rawtypes" })
protected boolean setPropertyValue(Object parent, String name, Object value) {
    if (parent instanceof Map) {
        ((Map) parent).put(name, value);
        return true;
    }
    ObjectDeserializer derializer = parserConfig.getDeserializer(parent.getClass());
    JavaBeanDeserializer beanDerializer = null;
    if (derializer instanceof JavaBeanDeserializer) {
        beanDerializer = (JavaBeanDeserializer) derializer;
    } else if (derializer instanceof ASMJavaBeanDeserializer) {
        beanDerializer = ((ASMJavaBeanDeserializer) derializer).getInnterSerializer();
    }
    if (beanDerializer != null) {
        FieldDeserializer fieldDeserializer = beanDerializer.getFieldDeserializer(name);
        if (fieldDeserializer == null) {
            return false;
        }
        fieldDeserializer.setValue(parent, value);
        return true;
    }
    throw new UnsupportedOperationException();
}
Also used : FieldDeserializer(com.alibaba.fastjson.parser.deserializer.FieldDeserializer) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map) ObjectDeserializer(com.alibaba.fastjson.parser.deserializer.ObjectDeserializer) ASMJavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer) JavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer) ASMJavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.ASMJavaBeanDeserializer)

Example 19 with ObjectDeserializer

use of com.alibaba.fastjson.parser.deserializer.ObjectDeserializer in project uavstack by uavorg.

the class DefaultJSONParser method parseArray.

@SuppressWarnings({ "unchecked", "rawtypes" })
public void parseArray(Type type, Collection array, Object fieldName) {
    if (lexer.token() == JSONToken.SET || lexer.token() == JSONToken.TREE_SET) {
        lexer.nextToken();
    }
    if (lexer.token() != JSONToken.LBRACKET) {
        throw new JSONException("exepct '[', but " + JSONToken.name(lexer.token()));
    }
    ObjectDeserializer deserializer = null;
    if (int.class == type) {
        deserializer = IntegerCodec.instance;
        lexer.nextToken(JSONToken.LITERAL_INT);
    } else if (String.class == type) {
        deserializer = StringCodec.instance;
        lexer.nextToken(JSONToken.LITERAL_STRING);
    } else {
        deserializer = config.getDeserializer(type);
        lexer.nextToken(deserializer.getFastMatchToken());
    }
    ParseContext context = this.getContext();
    this.setContext(array, fieldName);
    try {
        for (int i = 0; ; ++i) {
            if (isEnabled(Feature.AllowArbitraryCommas)) {
                while (lexer.token() == JSONToken.COMMA) {
                    lexer.nextToken();
                    continue;
                }
            }
            if (lexer.token() == JSONToken.RBRACKET) {
                break;
            }
            if (int.class == type) {
                Object val = IntegerCodec.instance.deserialze(this, null, null);
                array.add(val);
            } else if (String.class == type) {
                String value;
                if (lexer.token() == JSONToken.LITERAL_STRING) {
                    value = lexer.stringVal();
                    lexer.nextToken(JSONToken.COMMA);
                } else {
                    Object obj = this.parse();
                    if (obj == null) {
                        value = null;
                    } else {
                        value = obj.toString();
                    }
                }
                array.add(value);
            } else {
                Object val;
                if (lexer.token() == JSONToken.NULL) {
                    lexer.nextToken();
                    val = null;
                } else {
                    val = deserializer.deserialze(this, type, i);
                }
                array.add(val);
                checkListResolve(array);
            }
            if (lexer.token() == JSONToken.COMMA) {
                lexer.nextToken(deserializer.getFastMatchToken());
                continue;
            }
        }
    } finally {
        this.setContext(context);
    }
    lexer.nextToken(JSONToken.COMMA);
}
Also used : JSONException(com.alibaba.fastjson.JSONException) JSONObject(com.alibaba.fastjson.JSONObject) ObjectDeserializer(com.alibaba.fastjson.parser.deserializer.ObjectDeserializer)

Example 20 with ObjectDeserializer

use of com.alibaba.fastjson.parser.deserializer.ObjectDeserializer in project fastjson by alibaba.

the class JSONPath method removePropertyValue.

@SuppressWarnings({ "rawtypes" })
protected boolean removePropertyValue(Object parent, String name, boolean deep) {
    if (parent instanceof Map) {
        Object origin = ((Map) parent).remove(name);
        boolean found = origin != null;
        if (deep) {
            for (Object item : ((Map) parent).values()) {
                removePropertyValue(item, name, deep);
            }
        }
        return found;
    }
    ObjectDeserializer deserializer = parserConfig.getDeserializer(parent.getClass());
    JavaBeanDeserializer beanDeserializer = null;
    if (deserializer instanceof JavaBeanDeserializer) {
        beanDeserializer = (JavaBeanDeserializer) deserializer;
    }
    if (beanDeserializer != null) {
        FieldDeserializer fieldDeserializer = beanDeserializer.getFieldDeserializer(name);
        boolean found = false;
        if (fieldDeserializer != null) {
            fieldDeserializer.setValue(parent, null);
            found = true;
        }
        if (deep) {
            Collection<Object> propertyValues = this.getPropertyValues(parent);
            for (Object item : propertyValues) {
                if (item == null) {
                    continue;
                }
                removePropertyValue(item, name, deep);
            }
        }
        return found;
    }
    if (deep) {
        return false;
    }
    throw new UnsupportedOperationException();
}
Also used : FieldDeserializer(com.alibaba.fastjson.parser.deserializer.FieldDeserializer) HashMap(java.util.HashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap) Map(java.util.Map) IdentityHashMap(java.util.IdentityHashMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ObjectDeserializer(com.alibaba.fastjson.parser.deserializer.ObjectDeserializer) JavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer)

Aggregations

ObjectDeserializer (com.alibaba.fastjson.parser.deserializer.ObjectDeserializer)27 JSONObject (com.alibaba.fastjson.JSONObject)12 JSONException (com.alibaba.fastjson.JSONException)10 JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer)10 Type (java.lang.reflect.Type)9 FieldDeserializer (com.alibaba.fastjson.parser.deserializer.FieldDeserializer)8 HashMap (java.util.HashMap)7 Map (java.util.Map)7 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)7 ConcurrentMap (java.util.concurrent.ConcurrentMap)7 DefaultJSONParser (com.alibaba.fastjson.parser.DefaultJSONParser)5 ParameterizedType (java.lang.reflect.ParameterizedType)4 WildcardType (java.lang.reflect.WildcardType)4 BigInteger (java.math.BigInteger)4 AccessControlException (java.security.AccessControlException)4 ArrayList (java.util.ArrayList)4 IdentityHashMap (java.util.IdentityHashMap)4 ParserConfig (com.alibaba.fastjson.parser.ParserConfig)3 ParseException (java.text.ParseException)3 List (java.util.List)3