From f753aa5d7f120371f715488b3fdfada5d5a7a502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Mon, 4 May 2020 16:45:41 +0800 Subject: [PATCH] bug fixed for #3138 --- .../alibaba/fastjson/parser/JSONLexer.java | 1 + .../fastjson/parser/JSONLexerBase.java | 4 +++ .../DefaultFieldDeserializer.java | 3 +- .../parser/deserializer/MapDeserializer.java | 29 +++++++++++++------ .../json/bvt/issue_3000/Issue3138.java | 19 ++++++++++++ 5 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 src/test/java/com/alibaba/json/bvt/issue_3000/Issue3138.java diff --git a/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java b/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java index 4d18e60e0..4cb954556 100644 --- a/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java +++ b/src/main/java/com/alibaba/fastjson/parser/JSONLexer.java @@ -122,4 +122,5 @@ public interface JSONLexer { String info(); int getFeatures(); + void setFeatures(int features); } diff --git a/src/main/java/com/alibaba/fastjson/parser/JSONLexerBase.java b/src/main/java/com/alibaba/fastjson/parser/JSONLexerBase.java index ad725d2ca..9b24709e5 100755 --- a/src/main/java/com/alibaba/fastjson/parser/JSONLexerBase.java +++ b/src/main/java/com/alibaba/fastjson/parser/JSONLexerBase.java @@ -5324,4 +5324,8 @@ public abstract class JSONLexerBase implements JSONLexer, Closeable { public int getFeatures() { return this.features; } + + public void setFeatures(int features) { + this.features = features; + } } diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java index fae6b037d..83f3b0461 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java @@ -74,7 +74,8 @@ public class DefaultFieldDeserializer extends FieldDeserializer { JavaBeanDeserializer javaBeanDeser = (JavaBeanDeserializer) fieldValueDeserilizer; value = javaBeanDeser.deserialze(parser, fieldType, fieldInfo.name, fieldInfo.parserFeatures); } else { - if (this.fieldInfo.format != null && fieldValueDeserilizer instanceof ContextObjectDeserializer) { + if ((this.fieldInfo.format != null || this.fieldInfo.parserFeatures != 0) + && fieldValueDeserilizer instanceof ContextObjectDeserializer) { value = ((ContextObjectDeserializer) fieldValueDeserilizer) // .deserialze(parser, fieldType, diff --git a/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java b/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java index 7ecbda2d2..8d69b4acf 100644 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java @@ -13,12 +13,12 @@ import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.*; import com.alibaba.fastjson.parser.DefaultJSONParser.ResolveTask; -public class MapDeserializer implements ObjectDeserializer { +public class MapDeserializer extends ContextObjectDeserializer implements ObjectDeserializer { public static MapDeserializer instance = new MapDeserializer(); - - + @SuppressWarnings("unchecked") - public T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { + public T deserialze(DefaultJSONParser parser, Type type, Object fieldName, String format, int features) + { if (type == JSONObject.class && parser.getFieldTypeResolver() == null) { return (T) parser.parseObject(); } @@ -40,7 +40,7 @@ public class MapDeserializer implements ObjectDeserializer { try { parser.setContext(context, map, fieldName); - T t = (T) deserialze(parser, type, fieldName, map); + T t = (T) deserialze(parser, type, fieldName, map, features); if (unmodifiableMap) { t = (T) Collections.unmodifiableMap((Map) t); } @@ -50,8 +50,12 @@ public class MapDeserializer implements ObjectDeserializer { } } - @SuppressWarnings({ "rawtypes", "unchecked" }) protected Object deserialze(DefaultJSONParser parser, Type type, Object fieldName, Map map) { + return deserialze(parser, type, fieldName, map, 0); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + protected Object deserialze(DefaultJSONParser parser, Type type, Object fieldName, Map map, int features) { if (type instanceof ParameterizedType) { ParameterizedType parameterizedType = (ParameterizedType) type; Type keyType = parameterizedType.getActualTypeArguments()[0]; @@ -62,7 +66,7 @@ public class MapDeserializer implements ObjectDeserializer { valueType = parameterizedType.getActualTypeArguments()[1]; } if (String.class == keyType) { - return parseMap(parser, (Map) map, valueType, fieldName); + return parseMap(parser, (Map) map, valueType, fieldName, features); } else { return parseMap(parser, map, keyType, valueType, fieldName); } @@ -70,9 +74,13 @@ public class MapDeserializer implements ObjectDeserializer { return parser.parseObject(map, fieldName); } } + + public static Map parseMap(DefaultJSONParser parser, Map map, Type valueType, Object fieldName) { + return parseMap(parser, map, valueType, fieldName, 0); + } @SuppressWarnings("rawtypes") - public static Map parseMap(DefaultJSONParser parser, Map map, Type valueType, Object fieldName) { + public static Map parseMap(DefaultJSONParser parser, Map map, Type valueType, Object fieldName, int features) { JSONLexer lexer = parser.lexer; int token = lexer.token(); @@ -156,7 +164,10 @@ public class MapDeserializer implements ObjectDeserializer { lexer.resetStringPosition(); - if (key == JSON.DEFAULT_TYPE_KEY && !lexer.isEnabled(Feature.DisableSpecialKeyDetect)) { + if (key == JSON.DEFAULT_TYPE_KEY + && !lexer.isEnabled(Feature.DisableSpecialKeyDetect) + && !Feature.isEnabled(features, Feature.DisableSpecialKeyDetect) + ) { String typeName = lexer.scanSymbol(parser.getSymbolTable(), '"'); final ParserConfig config = parser.getConfig(); diff --git a/src/test/java/com/alibaba/json/bvt/issue_3000/Issue3138.java b/src/test/java/com/alibaba/json/bvt/issue_3000/Issue3138.java new file mode 100644 index 000000000..99b15b498 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/issue_3000/Issue3138.java @@ -0,0 +1,19 @@ +package com.alibaba.json.bvt.issue_3000; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.annotation.JSONField; +import com.alibaba.fastjson.parser.Feature; +import junit.framework.TestCase; + +import java.util.Map; + +public class Issue3138 extends TestCase { + public void test_0() throws Exception { + VO vo = JSON.parseObject("{\"value\":{\"@type\":\"aa\"}}", VO.class); + } + + public static class VO { + @JSONField(parseFeatures = Feature.DisableSpecialKeyDetect) + public Map value; + } +}