mirror of
https://github.com/alibaba/fastjson.git
synced 2026-10-29 06:06:50 +08:00
improved performance
This commit is contained in:
@@ -970,13 +970,13 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
|
||||
final int index = array.size() - 1;
|
||||
final List list = (List) array;
|
||||
ResolveTask task = getLastResolveTask();
|
||||
task.setFieldDeserializer(new ListResolveFieldDeserializer(this, list, index));
|
||||
task.setOwnerContext(context);
|
||||
task.fieldDeserializer = new ListResolveFieldDeserializer(this, list, index);
|
||||
task.ownerContext = context;
|
||||
setResolveStatus(DefaultJSONParser.NONE);
|
||||
} else {
|
||||
ResolveTask task = getLastResolveTask();
|
||||
task.setFieldDeserializer(new CollectionResolveFieldDeserializer(this, array));
|
||||
task.setOwnerContext(context);
|
||||
task.fieldDeserializer = new CollectionResolveFieldDeserializer(this, array);
|
||||
task.ownerContext = context;
|
||||
setResolveStatus(DefaultJSONParser.NONE);
|
||||
}
|
||||
}
|
||||
@@ -987,8 +987,8 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
|
||||
if (resolveStatus == NeedToResolve) {
|
||||
MapResolveFieldDeserializer fieldResolver = new MapResolveFieldDeserializer(object, fieldName);
|
||||
ResolveTask task = getLastResolveTask();
|
||||
task.setFieldDeserializer(fieldResolver);
|
||||
task.setOwnerContext(context);
|
||||
task.fieldDeserializer = fieldResolver;
|
||||
task.ownerContext = context;
|
||||
setResolveStatus(DefaultJSONParser.NONE);
|
||||
}
|
||||
}
|
||||
@@ -1358,23 +1358,23 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
|
||||
int size = resolveTaskList.size();
|
||||
for (int i = 0; i < size; ++i) {
|
||||
ResolveTask task = resolveTaskList.get(i);
|
||||
FieldDeserializer fieldDeser = task.getFieldDeserializer();
|
||||
FieldDeserializer fieldDeser = task.fieldDeserializer;
|
||||
|
||||
if (fieldDeser == null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Object object = null;
|
||||
if (task.getOwnerContext() != null) {
|
||||
object = task.getOwnerContext().object;
|
||||
if (task.ownerContext != null) {
|
||||
object = task.ownerContext.object;
|
||||
}
|
||||
|
||||
String ref = task.getReferenceValue();
|
||||
String ref = task.referenceValue;
|
||||
Object refValue;
|
||||
if (ref.startsWith("$")) {
|
||||
refValue = getObject(ref);
|
||||
} else {
|
||||
refValue = task.getContext().object;
|
||||
refValue = task.context.object;
|
||||
}
|
||||
fieldDeser.setValue(object, refValue);
|
||||
}
|
||||
@@ -1384,38 +1384,13 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable {
|
||||
|
||||
private final ParseContext context;
|
||||
private final String referenceValue;
|
||||
private FieldDeserializer fieldDeserializer;
|
||||
private ParseContext ownerContext;
|
||||
public FieldDeserializer fieldDeserializer;
|
||||
public ParseContext ownerContext;
|
||||
|
||||
public ResolveTask(ParseContext context, String referenceValue){
|
||||
this.context = context;
|
||||
this.referenceValue = referenceValue;
|
||||
}
|
||||
|
||||
public ParseContext getContext() {
|
||||
return context;
|
||||
}
|
||||
|
||||
public String getReferenceValue() {
|
||||
return referenceValue;
|
||||
}
|
||||
|
||||
public FieldDeserializer getFieldDeserializer() {
|
||||
return fieldDeserializer;
|
||||
}
|
||||
|
||||
public void setFieldDeserializer(FieldDeserializer fieldDeserializer) {
|
||||
this.fieldDeserializer = fieldDeserializer;
|
||||
}
|
||||
|
||||
public ParseContext getOwnerContext() {
|
||||
return ownerContext;
|
||||
}
|
||||
|
||||
public void setOwnerContext(ParseContext ownerContext) {
|
||||
this.ownerContext = ownerContext;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1047,10 +1047,6 @@ public class ASMDeserializerFactory implements Opcodes {
|
||||
mw.visitFieldInsn(GETSTATIC, "com/alibaba/fastjson/parser/DefaultJSONParser", "NeedToResolve", "I");
|
||||
mw.visitJumpInsn(IF_ICMPNE, _end_if);
|
||||
|
||||
// ResolveTask task = parser.getLastResolveTask();
|
||||
// task.setFieldDeserializer(this);
|
||||
// task.setOwnerContext(parser.getContext());
|
||||
|
||||
mw.visitVarInsn(ALOAD, 1);
|
||||
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser", "getLastResolveTask",
|
||||
"()Lcom/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask;");
|
||||
@@ -1060,17 +1056,14 @@ public class ASMDeserializerFactory implements Opcodes {
|
||||
mw.visitVarInsn(ALOAD, 1);
|
||||
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser", "getContext", "()"
|
||||
+ "Lcom/alibaba/fastjson/parser/ParseContext;");
|
||||
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask"
|
||||
, "setOwnerContext"
|
||||
, "(Lcom/alibaba/fastjson/parser/ParseContext;)V");
|
||||
mw.visitFieldInsn(PUTFIELD, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask", "ownerContext", "Lcom/alibaba/fastjson/parser/ParseContext;");
|
||||
|
||||
mw.visitVarInsn(ALOAD, context.var("resolveTask"));
|
||||
mw.visitVarInsn(ALOAD, 0);
|
||||
mw.visitLdcInsn(fieldInfo.name);
|
||||
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/deserializer/ASMJavaBeanDeserializer", "getFieldDeserializer",
|
||||
"(Ljava/lang/String;)Lcom/alibaba/fastjson/parser/deserializer/FieldDeserializer;");
|
||||
mw.visitMethodInsn(INVOKEVIRTUAL, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask", "setFieldDeserializer",
|
||||
"(Lcom/alibaba/fastjson/parser/deserializer/FieldDeserializer;)V");
|
||||
mw.visitFieldInsn(PUTFIELD, "com/alibaba/fastjson/parser/DefaultJSONParser$ResolveTask", "fieldDeserializer", "Lcom/alibaba/fastjson/parser/deserializer/FieldDeserializer;");
|
||||
|
||||
mw.visitVarInsn(ALOAD, 1);
|
||||
mw.visitFieldInsn(GETSTATIC, "com/alibaba/fastjson/parser/DefaultJSONParser", "NONE", "I");
|
||||
|
||||
+2
-2
@@ -33,8 +33,8 @@ public class DefaultFieldDeserializer extends FieldDeserializer {
|
||||
Object value = fieldValueDeserilizer.deserialze(parser, getFieldType(), fieldInfo.name);
|
||||
if (parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
|
||||
ResolveTask task = parser.getLastResolveTask();
|
||||
task.setFieldDeserializer(this);
|
||||
task.setOwnerContext(parser.getContext());
|
||||
task.fieldDeserializer = this;
|
||||
task.ownerContext = parser.getContext();
|
||||
parser.setResolveStatus(DefaultJSONParser.NONE);
|
||||
} else {
|
||||
if (object == null) {
|
||||
|
||||
@@ -96,8 +96,8 @@ public class DepartmentCodec extends ASMJavaBeanDeserializer implements ObjectDe
|
||||
matchedCount++;
|
||||
if(parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
|
||||
ResolveTask resolveTask = parser.getLastResolveTask();
|
||||
resolveTask.setOwnerContext(parser.getContext());
|
||||
resolveTask.setFieldDeserializer(this.getFieldDeserializer("leader"));
|
||||
resolveTask.ownerContext = parser.getContext();
|
||||
resolveTask.fieldDeserializer = this.getFieldDeserializer("leader");
|
||||
parser.setResolveStatus(DefaultJSONParser.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,8 +121,8 @@ public class MediaContentGenDecoder extends ASMJavaBeanDeserializer implements O
|
||||
media_gen_deser__.deserialze(parser, data.media.Media.class,"media");
|
||||
if(parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
|
||||
ResolveTask resolveTask = parser.getLastResolveTask();
|
||||
resolveTask.setOwnerContext(parser.getContext());
|
||||
resolveTask.setFieldDeserializer(this.getFieldDeserializer("media"));
|
||||
resolveTask.ownerContext = parser.getContext();
|
||||
resolveTask.fieldDeserializer = this.getFieldDeserializer("media");
|
||||
parser.setResolveStatus(DefaultJSONParser.NONE);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user