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;
}
}
}
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();
}
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);
}
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);
}
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();
}
Aggregations