From 5dfdb16f5cd4dc973cd047abe8fc9e0ae5c4271c Mon Sep 17 00:00:00 2001 From: Yako Date: Mon, 2 Mar 2015 16:05:05 +0800 Subject: [PATCH] support DisableSpecialKey --- .../fastjson/parser/DefaultJSONParser.java | 4 +- .../com/alibaba/fastjson/parser/Feature.java | 8 +++- .../parser/deserializer/MapDeserializer.java | 8 ++-- .../json/bvt/DisableSpecialKeyDetectTest.java | 47 +++++++++++++++++++ 4 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/alibaba/json/bvt/DisableSpecialKeyDetectTest.java diff --git a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java index e64e9a67f..fc69f957c 100755 --- a/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java +++ b/src/main/java/com/alibaba/fastjson/parser/DefaultJSONParser.java @@ -281,7 +281,7 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable { lexer.resetStringPosition(); - if (key == JSON.DEFAULT_TYPE_KEY) { + if (key == JSON.DEFAULT_TYPE_KEY && !isEnabled(Feature.DisableSpecialKeyDetect)) { String typeName = lexer.scanSymbol(symbolTable, '"'); Class clazz = TypeUtils.loadClass(typeName); @@ -326,7 +326,7 @@ public class DefaultJSONParser extends AbstractJSONParser implements Closeable { return deserializer.deserialze(this, clazz, fieldName); } - if (key == "$ref") { + if (key == "$ref" && !isEnabled(Feature.DisableSpecialKeyDetect)) { lexer.nextToken(JSONToken.LITERAL_STRING); if (lexer.token() == JSONToken.LITERAL_STRING) { String ref = lexer.stringVal(); diff --git a/src/main/java/com/alibaba/fastjson/parser/Feature.java b/src/main/java/com/alibaba/fastjson/parser/Feature.java index 507c4c0ed..90563e606 100755 --- a/src/main/java/com/alibaba/fastjson/parser/Feature.java +++ b/src/main/java/com/alibaba/fastjson/parser/Feature.java @@ -90,7 +90,13 @@ public enum Feature { * @since 1.2.3 * */ - OrderedField + OrderedField, + + /** + * @since 1.2.5 + * + */ + DisableSpecialKeyDetect ; private Feature(){ 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 7de1b4f75..6ee0d6026 100755 --- a/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java +++ b/src/main/java/com/alibaba/fastjson/parser/deserializer/MapDeserializer.java @@ -128,7 +128,7 @@ public class MapDeserializer implements ObjectDeserializer { lexer.resetStringPosition(); - if (key == JSON.DEFAULT_TYPE_KEY) { + if (key == JSON.DEFAULT_TYPE_KEY && !parser.isEnabled(Feature.DisableSpecialKeyDetect)) { String typeName = lexer.scanSymbol(parser.getSymbolTable(), '"'); Class clazz = TypeUtils.loadClass(typeName); @@ -205,7 +205,8 @@ public class MapDeserializer implements ObjectDeserializer { break; } - if (lexer.token() == JSONToken.LITERAL_STRING && lexer.isRef()) { + if (lexer.token() == JSONToken.LITERAL_STRING && lexer.isRef() + && !parser.isEnabled(Feature.DisableSpecialKeyDetect)) { Object object = null; lexer.nextTokenWithColon(JSONToken.LITERAL_STRING); @@ -243,7 +244,8 @@ public class MapDeserializer implements ObjectDeserializer { if (map.size() == 0 // && lexer.token() == JSONToken.LITERAL_STRING // - && JSON.DEFAULT_TYPE_KEY.equals(lexer.stringVal())) { + && JSON.DEFAULT_TYPE_KEY.equals(lexer.stringVal()) // + && !parser.isEnabled(Feature.DisableSpecialKeyDetect)) { lexer.nextTokenWithColon(JSONToken.LITERAL_STRING); lexer.nextToken(JSONToken.COMMA); if (lexer.token() == JSONToken.RBRACE) { diff --git a/src/test/java/com/alibaba/json/bvt/DisableSpecialKeyDetectTest.java b/src/test/java/com/alibaba/json/bvt/DisableSpecialKeyDetectTest.java new file mode 100644 index 000000000..99a537715 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/DisableSpecialKeyDetectTest.java @@ -0,0 +1,47 @@ +package com.alibaba.json.bvt; + +import java.util.Map; +import java.util.Set; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.alibaba.fastjson.parser.Feature; + +public class DisableSpecialKeyDetectTest extends TestCase { + + public void test_0() throws Exception { + String json = "{\"schema\":{\"$ref\":{\"@title\":\"类目ID\",\"@type\":\"string\"},\"$\":{\"@\":\"类目名称\",\"type\":\"string\"},\"cat_desc\":{\"title\":\"类目描述\",\"type\":\"string\"}}}"; + JSONObject errorJson = JSON.parseObject(json, Feature.DisableSpecialKeyDetect); + JSONObject schema = errorJson.getJSONObject("schema"); + Set> es2 = schema.entrySet(); + for (Map.Entry entry : es2) { + System.out.println(entry.getKey() + "_" + entry.getValue()); + } + } + + public void test_1() throws Exception { + String text = "{\"@v1\":\"v1\",\"@type\":\"v2\", \"@\":\"v3\",\"$\":\"v4\",\"$ref\":\"v5\"}"; + JSONObject json = JSON.parseObject(text, Feature.DisableSpecialKeyDetect); + Assert.assertEquals("v1", json.getString("@v1")); + Assert.assertEquals("v2", json.getString("@type")); + Assert.assertEquals("v3", json.getString("@")); + Assert.assertEquals("v4", json.getString("$")); + Assert.assertEquals("v5", json.getString("$ref")); + } + + public void test_2() throws Exception { + String text = "{\"@v1\":\"v1\",\"@type\":\"v2\", \"@\":\"v3\",\"$\":\"v4\",\"$ref\":\"v5\"}"; + Map map = JSON.parseObject(text, new TypeReference>(){}, Feature.DisableSpecialKeyDetect); + Assert.assertEquals("v1", map.get("@v1")); + Assert.assertEquals("v2", map.get("@type")); + Assert.assertEquals("v3", map.get("@")); + Assert.assertEquals("v4", map.get("$")); + Assert.assertEquals("v5", map.get("$ref")); + } + +}