Skip to content

Commit

Permalink
add java.nio.file.Path support
Browse files Browse the repository at this point in the history
  • Loading branch information
wenshao committed Apr 25, 2016
1 parent c635c87 commit a303f8c
Show file tree
Hide file tree
Showing 6 changed files with 114 additions and 7 deletions.
11 changes: 11 additions & 0 deletions src/main/java/com/alibaba/fastjson/parser/ParserConfig.java
Expand Up @@ -81,6 +81,7 @@
import com.alibaba.fastjson.parser.deserializer.NumberDeserializer; import com.alibaba.fastjson.parser.deserializer.NumberDeserializer;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import com.alibaba.fastjson.parser.deserializer.OptionalCodec; import com.alibaba.fastjson.parser.deserializer.OptionalCodec;
import com.alibaba.fastjson.parser.deserializer.PathDeserializer;
import com.alibaba.fastjson.parser.deserializer.SqlDateDeserializer; import com.alibaba.fastjson.parser.deserializer.SqlDateDeserializer;
import com.alibaba.fastjson.parser.deserializer.StackTraceElementDeserializer; import com.alibaba.fastjson.parser.deserializer.StackTraceElementDeserializer;
import com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer; import com.alibaba.fastjson.parser.deserializer.ThrowableDeserializer;
Expand Down Expand Up @@ -134,6 +135,7 @@ public static ParserConfig getGlobalInstance() {
protected ASMDeserializerFactory asmFactory; protected ASMDeserializerFactory asmFactory;


private static boolean awtError = false; private static boolean awtError = false;
private static boolean jdk7Error = false;
private static boolean jdk8Error = false; private static boolean jdk8Error = false;


private String[] denyList = new String[] { "java.lang.Thread" }; private String[] denyList = new String[] { "java.lang.Thread" };
Expand Down Expand Up @@ -262,6 +264,15 @@ private ParserConfig(ASMDeserializerFactory asmFactory, ClassLoader parentClassL
} }
} }


if (!jdk7Error) {
try {
derializers.put(Class.forName("java.nio.file.Path"), new PathDeserializer());
} catch (Throwable e) {
// skip
jdk7Error = true;
}
}

if (!jdk8Error) { if (!jdk8Error) {
try { try {
derializers.put(Class.forName("java.time.LocalDateTime"), Jdk8DateCodec.instance); derializers.put(Class.forName("java.time.LocalDateTime"), Jdk8DateCodec.instance);
Expand Down
@@ -0,0 +1,32 @@
package com.alibaba.fastjson.parser.deserializer;

import java.lang.reflect.Type;
import java.nio.file.Paths;

import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.JSONLexer;
import com.alibaba.fastjson.parser.JSONToken;

public class PathDeserializer implements ObjectDeserializer {

@SuppressWarnings("unchecked")
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
JSONLexer lexer = parser.lexer;
if (lexer.token() == JSONToken.NULL) {
lexer.nextToken();
return null;
}

String path = lexer.stringVal();
lexer.nextToken(JSONToken.COMMA);

return (T) Paths.get(path);
}

@Override
public int getFastMatchToken() {
return JSONToken.LITERAL_STRING;
}

}
4 changes: 2 additions & 2 deletions src/main/java/com/alibaba/fastjson/serializer/MiscCodec.java
Expand Up @@ -59,7 +59,7 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty
return; return;
} }


Object objClass = object.getClass(); Class<?> objClass = object.getClass();


String strVal; String strVal;
if (objClass == SimpleDateFormat.class) { if (objClass == SimpleDateFormat.class) {
Expand Down Expand Up @@ -115,7 +115,7 @@ public void write(JSONSerializer serializer, Object object, Object fieldName, Ty
writeIterator(serializer, out, it); writeIterator(serializer, out, it);
return; return;
} else { } else {
strVal = object.toString(); throw new JSONException("not support class : " + objClass);
} }


out.writeString(strVal); out.writeString(strVal);
Expand Down
22 changes: 17 additions & 5 deletions src/main/java/com/alibaba/fastjson/serializer/SerializeConfig.java
Expand Up @@ -74,6 +74,7 @@ public class SerializeConfig {
public final static SerializeConfig globalInstance = new SerializeConfig(); public final static SerializeConfig globalInstance = new SerializeConfig();


private static boolean awtError = false; private static boolean awtError = false;
private static boolean jdk7Error = false;
private static boolean jdk8Error = false; private static boolean jdk8Error = false;
private static boolean oracleJdbcError = false; private static boolean oracleJdbcError = false;


Expand Down Expand Up @@ -204,22 +205,22 @@ public SerializeConfig(int tableSize) {
put(Class.class, MiscCodec.instance); put(Class.class, MiscCodec.instance);


put(SimpleDateFormat.class, MiscCodec.instance); put(SimpleDateFormat.class, MiscCodec.instance);
put(Locale.class, MiscCodec.instance);
put(Currency.class, CurrencyCodec.instance); put(Currency.class, CurrencyCodec.instance);
put(TimeZone.class, MiscCodec.instance); put(TimeZone.class, MiscCodec.instance);
put(UUID.class, MiscCodec.instance);
put(InetAddress.class, MiscCodec.instance); put(InetAddress.class, MiscCodec.instance);
put(Inet4Address.class, MiscCodec.instance); put(Inet4Address.class, MiscCodec.instance);
put(Inet6Address.class, MiscCodec.instance); put(Inet6Address.class, MiscCodec.instance);
put(InetSocketAddress.class, MiscCodec.instance); put(InetSocketAddress.class, MiscCodec.instance);
put(File.class, MiscCodec.instance); put(File.class, MiscCodec.instance);
put(URI.class, MiscCodec.instance);
put(URL.class, MiscCodec.instance);
put(Appendable.class, AppendableSerializer.instance); put(Appendable.class, AppendableSerializer.instance);
put(StringBuffer.class, AppendableSerializer.instance); put(StringBuffer.class, AppendableSerializer.instance);
put(StringBuilder.class, AppendableSerializer.instance); put(StringBuilder.class, AppendableSerializer.instance);
put(Pattern.class, MiscCodec.instance);
put(Charset.class, CharsetCodec.instance); put(Charset.class, CharsetCodec.instance);
put(Pattern.class, ToStringSerializer.instance);
put(Locale.class, ToStringSerializer.instance);
put(URI.class, ToStringSerializer.instance);
put(URL.class, ToStringSerializer.instance);
put(UUID.class, ToStringSerializer.instance);


// atomic // atomic
put(AtomicBoolean.class, AtomicCodec.instance); put(AtomicBoolean.class, AtomicCodec.instance);
Expand All @@ -245,6 +246,17 @@ public SerializeConfig(int tableSize) {
} }
} }


if (!jdk7Error) {
try {
put(Class.forName("java.nio.file.Path"), ToStringSerializer.instance);
put(Class.forName("sun.nio.fs.UnixPath"), ToStringSerializer.instance);
put(Class.forName("com.sun.nio.zipfs.ZipPath"), ToStringSerializer.instance);
} catch (Throwable e) {
// skip
jdk7Error = true;
}
}

// jdk8 // jdk8
if (!jdk8Error) { if (!jdk8Error) {
try { try {
Expand Down
@@ -0,0 +1,24 @@
package com.alibaba.fastjson.serializer;

import java.io.IOException;
import java.lang.reflect.Type;

public class ToStringSerializer implements ObjectSerializer {

public static final ToStringSerializer instance = new ToStringSerializer();

@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
int features) throws IOException {
SerializeWriter out = serializer.out;

if (object == null) {
out.writeNull();
return;
}

String strVal = object.toString();
out.writeString(strVal);
}

}
28 changes: 28 additions & 0 deletions src/test/java/com/alibaba/json/bvt/jdk7/PathTest.java
@@ -0,0 +1,28 @@
package com.alibaba.json.bvt.jdk7;

import java.nio.file.Path;
import java.nio.file.Paths;

import org.junit.Assert;

import com.alibaba.fastjson.JSON;

import junit.framework.TestCase;

public class PathTest extends TestCase {
public void test_for_path() throws Exception {
Model model = new Model();
model.path = Paths.get("/root/fastjson");

String text = JSON.toJSONString(model);

Assert.assertEquals("{\"path\":\"/root/fastjson\"}", text);

Model model2 = JSON.parseObject(text, Model.class);
Assert.assertEquals(model.path.toString(), model2.path.toString());
}

public static class Model {
public Path path;
}
}

0 comments on commit a303f8c

Please sign in to comment.