Skip to content

Commit

Permalink
fastjson.properties support 'parser.features.ErrorOnEnumNotMatch'
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Jan 20, 2019
1 parent 0b9f09b commit 0546d84
Show file tree
Hide file tree
Showing 14 changed files with 140 additions and 55 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Expand Up @@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId> <artifactId>fastjson</artifactId>
<version>1.2.55_preview_06</version> <version>1.2.56_preview_01</version>


<packaging>jar</packaging> <packaging>jar</packaging>
<name>fastjson</name> <name>fastjson</name>
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/alibaba/fastjson/JSON.java
Expand Up @@ -111,6 +111,12 @@ private static void config(Properties properties) {
DEFAULT_PARSER_FEATURE |= Feature.NonStringKeyAsString.getMask(); DEFAULT_PARSER_FEATURE |= Feature.NonStringKeyAsString.getMask();
} }
} }

{
if ("true".equals(properties.getProperty("parser.features.ErrorOnEnumNotMatch"))) {
DEFAULT_PARSER_FEATURE |= Feature.ErrorOnEnumNotMatch.getMask();
}
}
} }


/** /**
Expand Down
@@ -1,7 +1,6 @@
package com.alibaba.json.bvt.issue_2200; package com.alibaba.json.bvt.issue_2200;


import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import junit.framework.TestCase; import junit.framework.TestCase;


import java.time.LocalDateTime; import java.time.LocalDateTime;
Expand Down
Expand Up @@ -24,4 +24,13 @@ public void test_enum() throws Exception {
Assert.assertEquals("'Small'", JSON.toJSONString(Type.Small, SerializerFeature.UseSingleQuotes)); // "Small" Assert.assertEquals("'Small'", JSON.toJSONString(Type.Small, SerializerFeature.UseSingleQuotes)); // "Small"
} }


public void test_empty() throws Exception {
Model model = JSON.parseObject("{\"type\":\"\"}", Model.class);
assertNull(model.type);
}

public static class Model {
public Type type;
}

} }
Expand Up @@ -19,15 +19,13 @@ public void test_0() throws Exception {
config.addFilter(ModelA.class, // config.addFilter(ModelA.class, //
new ContextValueFilter() { new ContextValueFilter() {


@Override
public Object process(BeanContext context, Object object, String name, Object value) { public Object process(BeanContext context, Object object, String name, Object value) {
return 30001; return 30001;
} }
}); });
config.addFilter(ModelB.class, // config.addFilter(ModelB.class, //
new ContextValueFilter() { new ContextValueFilter() {


@Override
public Object process(BeanContext context, Object object, String name, Object value) { public Object process(BeanContext context, Object object, String name, Object value) {
return 20001; return 20001;
} }
Expand Down
25 changes: 25 additions & 0 deletions src/test/java/com/alibaba/json/bvt/util/UTF8DecoderTest.java
Expand Up @@ -137,4 +137,29 @@ public void test_4() throws Exception {


} }
} }

/**
* @deprecated
*/
public void test_5() throws Exception {
UTF8Decoder decoder = new UTF8Decoder();

String str = "⌛︎€\uD83D\uDC69\uD83D\uDC68\uD83D\uDC68\uD83C\uDFFB\uD83D\uDC69\uD83C\uDFFFU+1F9D2: Child\tText\t\uD83E\uDDD2\t\uD83E\uDDD2\uD83C\uDFFB\t\uD83E\uDDD2\uD83C\uDFFC\t\uD83E\uDDD2\uD83C\uDFFD\t\uD83E\uDDD2\uD83C\uDFFE\t\uD83E\uDDD2\uD83C\uDFFF\n\uD83E\uDDD1\uD83C\uDFFF\uD83C\uDE1A\uD83C\uDC04️❤️";
byte[] bytes =str.getBytes("UTF-8");
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
decoder.decode(byteBuffer);
}

/**
* @deprecated
*/
public void test_6() throws Exception {
UTF8Decoder decoder = new UTF8Decoder();

String str = "\u20AC";
byte[] bytes =str.getBytes("UTF-8");
ByteBuffer byteBuffer = ByteBuffer.wrap(bytes);
decoder.decode(byteBuffer);
}

} }
31 changes: 31 additions & 0 deletions src/test/java/com/alibaba/json/test/A1.java
@@ -1,9 +1,16 @@
package com.alibaba.json.test; package com.alibaba.json.test;


import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.util.IOUtils;
import junit.framework.TestCase; import junit.framework.TestCase;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/** /**
* Created by wenshao on 14/03/2017. * Created by wenshao on 14/03/2017.
*/ */
Expand All @@ -13,5 +20,29 @@ public void test_a() throws Exception {
Object obj = JSON.parse("[{\"feature\":\"\\u3A56\\u3A26\"}]"); Object obj = JSON.parse("[{\"feature\":\"\\u3A56\\u3A26\"}]");
String json = JSON.toJSONString(obj, SerializerFeature.BrowserCompatible); String json = JSON.toJSONString(obj, SerializerFeature.BrowserCompatible);
System.out.println(json); System.out.println(json);


}


public void test_ser() throws Exception {
// JSONObject obj = new JSONObject();
//
// ByteArrayOutputStream out = new ByteArrayOutputStream();
// ObjectOutputStream objOut = new ObjectOutputStream(out);
// objOut.writeObject(obj);
// objOut.flush();
// objOut.close();
// byte[] bytes = out.toByteArray();
//
// String str = Base64.encodeToString(bytes, false);
// System.out.println(str);

byte[] bytes2 = IOUtils.decodeBase64("rO0ABXNyAB9jb20uYWxpYmFiYS5mYXN0anNvbi5KU09OT2JqZWN0AAAAAAAAAAECAAFMAANtYXB0AA9MamF2YS91dGlsL01hcDt4cHNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAABB3CAAAABAAAAAAeA==");
ByteArrayInputStream byteIn = new ByteArrayInputStream(bytes2);
ObjectInputStream objIn = new ObjectInputStream(byteIn);
Object obj = objIn.readObject();
assertEquals(JSONObject.class, obj.getClass());

} }
} }
48 changes: 24 additions & 24 deletions src/test/java/com/alibaba/json/test/Base64.java
Expand Up @@ -86,56 +86,56 @@ public class Base64
// **************************************************************************************** // ****************************************************************************************


/** Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045. /** Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045.
* @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned. * @param bytes The bytes to convert. If <code>null</code> or length 0 an empty array will be returned.
* @param lineSep Optional "\r\n" after 76 characters, unless end of file.<br> * @param lineSep Optional "\r\n" after 76 characters, unless end of file.<br>
* No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a
* little faster. * little faster.
* @return A BASE64 encoded array. Never <code>null</code>. * @return A BASE64 encoded array. Never <code>null</code>.
*/ */
public final static char[] encodeToChar(byte[] sArr, boolean lineSep) public final static char[] encodeToChar(byte[] bytes, boolean lineSep)
{ {
// Check special case // Check special case
int sLen = sArr != null ? sArr.length : 0; int bytes_len = bytes != null ? bytes.length : 0;
if (sLen == 0) if (bytes_len == 0)
return new char[0]; return new char[0];


int eLen = (sLen / 3) * 3; // Length of even 24-bits. int eLen = (bytes_len / 3) * 3; // Length of even 24-bits.
int cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count int cCnt = ((bytes_len - 1) / 3 + 1) << 2; // Returned character count
int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array int chars_len = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array
char[] dArr = new char[dLen]; char[] chars = new char[chars_len];


// Encode even 24-bits // Encode even 24-bits
for (int s = 0, d = 0, cc = 0; s < eLen;) { for (int s = 0, d = 0, cc = 0; s < eLen;) {
// Copy next three bytes into lower 24 bits of int, paying attension to sign. // Copy next three bytes into lower 24 bits of int, paying attension to sign.
int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff); int i = (bytes[s++] & 0xff) << 16 | (bytes[s++] & 0xff) << 8 | (bytes[s++] & 0xff);


// Encode the int into four chars // Encode the int into four chars
dArr[d++] = CA[(i >>> 18) & 0x3f]; chars[d++] = CA[(i >>> 18) & 0x3f];
dArr[d++] = CA[(i >>> 12) & 0x3f]; chars[d++] = CA[(i >>> 12) & 0x3f];
dArr[d++] = CA[(i >>> 6) & 0x3f]; chars[d++] = CA[(i >>> 6) & 0x3f];
dArr[d++] = CA[i & 0x3f]; chars[d++] = CA[i & 0x3f];


// Add optional line separator // Add optional line separator
if (lineSep && ++cc == 19 && d < dLen - 2) { if (lineSep && ++cc == 19 && d < chars_len - 2) {
dArr[d++] = '\r'; chars[d++] = '\r';
dArr[d++] = '\n'; chars[d++] = '\n';
cc = 0; cc = 0;
} }
} }


// Pad and encode last bits if source isn't even 24 bits. // Pad and encode last bits if source isn't even 24 bits.
int left = sLen - eLen; // 0 - 2. int left = bytes_len - eLen; // 0 - 2.
if (left > 0) { if (left > 0) {
// Prepare the int // Prepare the int
int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0); int i = ((bytes[eLen] & 0xff) << 10) | (left == 2 ? ((bytes[bytes_len - 1] & 0xff) << 2) : 0);


// Set last four chars // Set last four chars
dArr[dLen - 4] = CA[i >> 12]; chars[chars_len - 4] = CA[i >> 12];
dArr[dLen - 3] = CA[(i >>> 6) & 0x3f]; chars[chars_len - 3] = CA[(i >>> 6) & 0x3f];
dArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '='; chars[chars_len - 2] = left == 2 ? CA[i & 0x3f] : '=';
dArr[dLen - 1] = '='; chars[chars_len - 1] = '=';
} }
return dArr; return chars;
} }


/** Decodes a BASE64 encoded char array. All illegal characters will be ignored and can handle both arrays with /** Decodes a BASE64 encoded char array. All illegal characters will be ignored and can handle both arrays with
Expand Down Expand Up @@ -517,7 +517,7 @@ public final static byte[] decode(String str)
* @param s The source string. Length 0 will return an empty array. <code>null</code> will throw an exception. * @param s The source string. Length 0 will return an empty array. <code>null</code> will throw an exception.
* @return The decoded array of bytes. May be of length 0. * @return The decoded array of bytes. May be of length 0.
*/ */
public final static byte[] decodeFast(String s) public final static byte[] dedecodeFast(String s)
{ {
// Check special case // Check special case
int sLen = s.length(); int sLen = s.length();
Expand Down
20 changes: 11 additions & 9 deletions src/test/java/com/alibaba/json/test/UTF8Test.java
Expand Up @@ -32,20 +32,22 @@ protected void setUp() throws Exception {
public void test_encode() throws Exception { public void test_encode() throws Exception {




for (int i = 0; i < 5; ++i) { // for (int i = 0; i < 5; ++i) {
f0(); // f0();
} // }
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
f1(); f1();
} }
for (int i = 0; i < 5; ++i) { // for (int i = 0; i < 5; ++i) {
f2(); // f2();
} // }
} }


final static int COUNT = 1000 * 1000 * 5;

private void f0() throws Exception { private void f0() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) { for (int i = 0; i < COUNT; ++i) {
text.getBytes(charset); text.getBytes(charset);
} }
long millis = System.currentTimeMillis() - start; long millis = System.currentTimeMillis() - start;
Expand All @@ -54,7 +56,7 @@ private void f0() throws Exception {


private void f1() throws Exception { private void f1() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) { for (int i = 0; i < COUNT; ++i) {
IOUtils.encodeUTF8(chars, 0, chars.length, bytes); IOUtils.encodeUTF8(chars, 0, chars.length, bytes);
} }
long millis = System.currentTimeMillis() - start; long millis = System.currentTimeMillis() - start;
Expand All @@ -63,7 +65,7 @@ private void f1() throws Exception {


private void f2() throws Exception { private void f2() throws Exception {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
for (int i = 0; i < 1000 * 1000; ++i) { for (int i = 0; i < COUNT; ++i) {
charset.newEncoder().encode(CharBuffer.wrap(chars)); charset.newEncoder().encode(CharBuffer.wrap(chars));
} }
long millis = System.currentTimeMillis() - start; long millis = System.currentTimeMillis() - start;
Expand Down
4 changes: 2 additions & 2 deletions src/test/java/com/alibaba/json/test/UTF8Test_decode.java
Expand Up @@ -37,8 +37,8 @@ public void test_encode() throws Exception {


for (int i = 0; i < 10; ++i) { for (int i = 0; i < 10; ++i) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
// f0(); // 764 f0(); // 764
f1(); // 695 // f1(); // 695
// f2(); // 975 // f2(); // 975
long millis = System.currentTimeMillis() - start; long millis = System.currentTimeMillis() - start;
System.out.println("millis : " + millis); System.out.println("millis : " + millis);
Expand Down
Expand Up @@ -29,10 +29,14 @@ public static void main(String[] args) throws Exception {
// executor.getCaseList().add(new EishayDecodeBytes()); // executor.getCaseList().add(new EishayDecodeBytes());
// executor.getCaseList().add(new EishayEncodeOutputStream()); // executor.getCaseList().add(new EishayEncodeOutputStream());
// executor.getCaseList().add(new EishayEncodeToBytes()); // executor.getCaseList().add(new EishayEncodeToBytes());
// executor.getCaseList().add(new EishayDecode()); executor.getCaseList().add(new EishayDecode()); // 1069
//JDK8_162 1094
//JDK9_01 1214
//JDK9_04 1252
//JDK10 1088
// executor.getCaseList().add(new EishayDecodeByClassName()); // executor.getCaseList().add(new EishayDecodeByClassName());
// executor.getCaseList().add(new EishayTreeDecode()); // executor.getCaseList().add(new EishayTreeDecode());
executor.getCaseList().add(new EishayEncode()); // executor.getCaseList().add(new EishayEncode());
// executor.getCaseList().add(new EishayEncodeManual()); // executor.getCaseList().add(new EishayEncodeManual());
// executor.getCaseList().add(new IntArray1000Decode()); // executor.getCaseList().add(new IntArray1000Decode());
// executor.getCaseList().add(new StringArray1000Decode()); // executor.getCaseList().add(new StringArray1000Decode());
Expand Down
Expand Up @@ -8,10 +8,10 @@ public class JSONPathBenchmarkTest {


public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
f0(); f0(); // 390 353
} }
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
f1(); // f1();
} }
} }


Expand Down
Expand Up @@ -19,6 +19,7 @@ public class IntBenchmark {
"}"; "}";


public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
System.out.println(System.getProperty("java.vm.name") + " " + System.getProperty("java.runtime.version"));
// Model model = new Model(); // Model model = new Model();
// model.v1 = new Random().nextInt(); // model.v1 = new Random().nextInt();
// model.v2 = new Random().nextInt(); // model.v2 = new Random().nextInt();
Expand All @@ -30,9 +31,9 @@ public static void main(String[] args) throws Exception {




for (int i = 0; i < 10; ++i) { for (int i = 0; i < 10; ++i) {
// perf(); // 1798 perf(); // 1798
// perf2(); // 1877 // perf2(); // 1877
perf3(); // 20624 2334 // perf3(); // 20624 2334
} }
} }


Expand Down

0 comments on commit 0546d84

Please sign in to comment.