Search in sources :

Example 1 with FieldDeserializer

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

the class DefaultJSONParser method parseObject.

public void parseObject(Object object) {
    Class<?> clazz = object.getClass();
    JavaBeanDeserializer beanDeser = null;
    ObjectDeserializer deserizer = config.getDeserializer(clazz);
    if (deserizer instanceof JavaBeanDeserializer) {
        beanDeser = (JavaBeanDeserializer) deserizer;
    }
    if (lexer.token() != JSONToken.LBRACE && lexer.token() != JSONToken.COMMA) {
        throw new JSONException("syntax error, expect {, actual " + lexer.tokenName());
    }
    for (; ; ) {
        // lexer.scanSymbol
        String key = lexer.scanSymbol(symbolTable);
        if (key == null) {
            if (lexer.token() == JSONToken.RBRACE) {
                lexer.nextToken(JSONToken.COMMA);
                break;
            }
            if (lexer.token() == JSONToken.COMMA) {
                if (lexer.isEnabled(Feature.AllowArbitraryCommas)) {
                    continue;
                }
            }
        }
        FieldDeserializer fieldDeser = null;
        if (beanDeser != null) {
            fieldDeser = beanDeser.getFieldDeserializer(key);
        }
        if (fieldDeser == null) {
            if (!lexer.isEnabled(Feature.IgnoreNotMatch)) {
                throw new JSONException("setter not found, class " + clazz.getName() + ", property " + key);
            }
            lexer.nextTokenWithColon();
            // skip
            parse();
            if (lexer.token() == JSONToken.RBRACE) {
                lexer.nextToken();
                return;
            }
            continue;
        } else {
            Class<?> fieldClass = fieldDeser.fieldInfo.fieldClass;
            Type fieldType = fieldDeser.fieldInfo.fieldType;
            Object fieldValue;
            if (fieldClass == int.class) {
                lexer.nextTokenWithColon(JSONToken.LITERAL_INT);
                fieldValue = IntegerCodec.instance.deserialze(this, fieldType, null);
            } else if (fieldClass == String.class) {
                lexer.nextTokenWithColon(JSONToken.LITERAL_STRING);
                fieldValue = StringCodec.deserialze(this);
            } else if (fieldClass == long.class) {
                lexer.nextTokenWithColon(JSONToken.LITERAL_INT);
                fieldValue = LongCodec.instance.deserialze(this, fieldType, null);
            } else {
                ObjectDeserializer fieldValueDeserializer = config.getDeserializer(fieldClass, fieldType);
                lexer.nextTokenWithColon(fieldValueDeserializer.getFastMatchToken());
                fieldValue = fieldValueDeserializer.deserialze(this, fieldType, null);
            }
            fieldDeser.setValue(object, fieldValue);
        }
        if (lexer.token() == JSONToken.COMMA) {
            continue;
        }
        if (lexer.token() == JSONToken.RBRACE) {
            lexer.nextToken(JSONToken.COMMA);
            return;
        }
    }
}
Also used : FieldDeserializer(com.alibaba.fastjson.parser.deserializer.FieldDeserializer) ResolveFieldDeserializer(com.alibaba.fastjson.parser.deserializer.ResolveFieldDeserializer) 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 2 with FieldDeserializer

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

the class JSONPath method removePropertyValue.

@SuppressWarnings({ "rawtypes" })
protected boolean removePropertyValue(Object parent, String name) {
    if (parent instanceof Map) {
        Object origin = ((Map) parent).remove(name);
        return origin != null;
    }
    ObjectDeserializer derializer = parserConfig.getDeserializer(parent.getClass());
    JavaBeanDeserializer beanDerializer = null;
    if (derializer instanceof JavaBeanDeserializer) {
        beanDerializer = (JavaBeanDeserializer) derializer;
    }
    if (beanDerializer != null) {
        FieldDeserializer fieldDeserializer = beanDerializer.getFieldDeserializer(name);
        if (fieldDeserializer == null) {
            return false;
        }
        fieldDeserializer.setValue(parent, null);
        return true;
    }
    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)

Example 3 with FieldDeserializer

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

the class JSONFieldTest_0 method test_0.

public void test_0() throws Exception {
    VO vo = new VO();
    vo.setF0(100);
    vo.setF1(101);
    vo.setF2(102);
    String text = JSON.toJSONString(vo);
    System.out.println(text);
    Assert.assertEquals("{\"f2\":102,\"f1\":101,\"f0\":100}", text);
    VO vo_decoded = JSON.parseObject(text, VO.class);
    Assert.assertEquals(vo.f0, vo_decoded.f0);
    Assert.assertEquals(vo.f1, vo_decoded.f1);
    Assert.assertEquals(vo.f2, vo_decoded.f2);
    JavaBeanDeserializer javaBeanDeser = null;
    ObjectDeserializer deser = ParserConfig.getGlobalInstance().getDeserializer(VO.class);
    javaBeanDeser = (JavaBeanDeserializer) deser;
    Field field = JavaBeanDeserializer.class.getDeclaredField("sortedFieldDeserializers");
    field.setAccessible(true);
    FieldDeserializer[] fieldDeserList = (FieldDeserializer[]) field.get(javaBeanDeser);
    Assert.assertEquals(3, fieldDeserList.length);
    Assert.assertEquals("f2", fieldDeserList[0].fieldInfo.name);
    Assert.assertEquals("f1", fieldDeserList[1].fieldInfo.name);
    Assert.assertEquals("f0", fieldDeserList[2].fieldInfo.name);
}
Also used : FieldDeserializer(com.alibaba.fastjson.parser.deserializer.FieldDeserializer) JSONField(com.alibaba.fastjson.annotation.JSONField) Field(java.lang.reflect.Field) ObjectDeserializer(com.alibaba.fastjson.parser.deserializer.ObjectDeserializer) JavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer)

Example 4 with FieldDeserializer

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

the class JSONFieldTest_1 method test_0.

public void test_0() throws Exception {
    VO vo = new VO();
    vo.setF0(100);
    vo.setF1(101);
    vo.setF2(102);
    String text = JSON.toJSONString(vo);
    System.out.println(text);
    Assert.assertEquals("{\"f2\":102,\"f1\":101,\"f0\":100}", text);
    VO vo_decoded = JSON.parseObject(text, VO.class);
    Assert.assertEquals(vo.f0, vo_decoded.f0);
    Assert.assertEquals(vo.f1, vo_decoded.f1);
    Assert.assertEquals(vo.f2, vo_decoded.f2);
    JavaBeanDeserializer javaBeanDeser = null;
    ObjectDeserializer deser = ParserConfig.getGlobalInstance().getDeserializer(VO.class);
    javaBeanDeser = (JavaBeanDeserializer) deser;
    Field field = JavaBeanDeserializer.class.getDeclaredField("sortedFieldDeserializers");
    field.setAccessible(true);
    FieldDeserializer[] fieldDeserList = (FieldDeserializer[]) field.get(javaBeanDeser);
    Assert.assertEquals(3, fieldDeserList.length);
    Assert.assertEquals("f2", fieldDeserList[0].fieldInfo.name);
    Assert.assertEquals("f1", fieldDeserList[1].fieldInfo.name);
    Assert.assertEquals("f0", fieldDeserList[2].fieldInfo.name);
}
Also used : FieldDeserializer(com.alibaba.fastjson.parser.deserializer.FieldDeserializer) JSONField(com.alibaba.fastjson.annotation.JSONField) Field(java.lang.reflect.Field) ObjectDeserializer(com.alibaba.fastjson.parser.deserializer.ObjectDeserializer) JavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer)

Example 5 with FieldDeserializer

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

the class JSONPath method set.

public boolean set(Object rootObject, Object value, boolean p) {
    if (rootObject == null) {
        return false;
    }
    init();
    Object currentObject = rootObject;
    Object parentObject = null;
    for (int i = 0; i < segments.length; ++i) {
        //            if (i == segments.length - 1) {
        //                parentObject = currentObject;
        //                break;
        //            }
        //            
        parentObject = currentObject;
        Segement segment = segments[i];
        currentObject = segment.eval(this, rootObject, currentObject);
        if (currentObject == null) {
            Segement nextSegement = null;
            if (i < segments.length - 1) {
                nextSegement = segments[i + 1];
            }
            Object newObj = null;
            if (nextSegement instanceof PropertySegement) {
                JavaBeanDeserializer beanDeserializer = null;
                Class<?> fieldClass = null;
                if (segment instanceof PropertySegement) {
                    String propertyName = ((PropertySegement) segment).propertyName;
                    Class<?> parentClass = parentObject.getClass();
                    JavaBeanDeserializer parentBeanDeserializer = getJavaBeanDeserializer(parentClass);
                    if (parentBeanDeserializer != null) {
                        FieldDeserializer fieldDeserializer = parentBeanDeserializer.getFieldDeserializer(propertyName);
                        fieldClass = fieldDeserializer.fieldInfo.fieldClass;
                        beanDeserializer = getJavaBeanDeserializer(fieldClass);
                    }
                }
                if (beanDeserializer != null) {
                    if (beanDeserializer.beanInfo.defaultConstructor != null) {
                        newObj = beanDeserializer.createInstance(null, fieldClass);
                    } else {
                        return false;
                    }
                } else {
                    newObj = new JSONObject();
                }
            } else if (nextSegement instanceof ArrayAccessSegement) {
                newObj = new JSONArray();
            }
            if (newObj != null) {
                if (segment instanceof PropertySegement) {
                    PropertySegement propSegement = (PropertySegement) segment;
                    propSegement.setValue(this, parentObject, newObj);
                    currentObject = newObj;
                    continue;
                } else if (segment instanceof ArrayAccessSegement) {
                    ArrayAccessSegement arrayAccessSegement = (ArrayAccessSegement) segment;
                    arrayAccessSegement.setValue(this, parentObject, newObj);
                    currentObject = newObj;
                    continue;
                }
            }
            break;
        }
    }
    if (parentObject == null) {
        return false;
    }
    Segement lastSegement = segments[segments.length - 1];
    if (lastSegement instanceof PropertySegement) {
        PropertySegement propertySegement = (PropertySegement) lastSegement;
        propertySegement.setValue(this, parentObject, value);
        return true;
    }
    if (lastSegement instanceof ArrayAccessSegement) {
        return ((ArrayAccessSegement) lastSegement).setValue(this, parentObject, value);
    }
    throw new UnsupportedOperationException();
}
Also used : FieldDeserializer(com.alibaba.fastjson.parser.deserializer.FieldDeserializer) JavaBeanDeserializer(com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer)

Aggregations

FieldDeserializer (com.alibaba.fastjson.parser.deserializer.FieldDeserializer)7 JavaBeanDeserializer (com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer)6 ObjectDeserializer (com.alibaba.fastjson.parser.deserializer.ObjectDeserializer)5 JSONField (com.alibaba.fastjson.annotation.JSONField)2 ResolveFieldDeserializer (com.alibaba.fastjson.parser.deserializer.ResolveFieldDeserializer)2 Field (java.lang.reflect.Field)2 HashMap (java.util.HashMap)2 IdentityHashMap (java.util.IdentityHashMap)2 Map (java.util.Map)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2 ConcurrentMap (java.util.concurrent.ConcurrentMap)2 ParameterizedType (java.lang.reflect.ParameterizedType)1 Type (java.lang.reflect.Type)1 WildcardType (java.lang.reflect.WildcardType)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1