From e1bd579bb56e7a999c5e6726d0952ea3ecc2135d Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 20 Mar 2017 18:36:36 +0800 Subject: [PATCH] android.net.Uri support. --- .../alibaba/fastjson/parser/ParserConfig.java | 8 ++++++- .../com/alibaba/fastjson/util/TypeUtils.java | 6 ++++- .../com/alibaba/json/bvt/android/UriTest.java | 24 +++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/alibaba/json/bvt/android/UriTest.java diff --git a/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java b/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java index a0fcbb792..412c765b0 100755 --- a/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java +++ b/src/main/java/com/alibaba/fastjson/parser/ParserConfig.java @@ -208,7 +208,13 @@ public class ParserConfig { } else if (Throwable.class.isAssignableFrom(clazz)) { deserializer = new ThrowableDeserializer(this, clazz); } else { - deserializer = new JavaBeanDeserializer(this, clazz, type); + String clazzName = clazz.getName(); + + if (clazzName.equals("android.net.Uri")) { + deserializer = MiscCodec.instance; + } else { + deserializer = new JavaBeanDeserializer(this, clazz, type); + } } putDeserializer(type, deserializer); diff --git a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java index c9db5b713..3f0e672fd 100755 --- a/src/main/java/com/alibaba/fastjson/util/TypeUtils.java +++ b/src/main/java/com/alibaba/fastjson/util/TypeUtils.java @@ -762,6 +762,10 @@ public class TypeUtils { if (className == null || className.length() == 0) { return null; } + + if (className.length() >= 256) { + throw new JSONException("className too long. " + className); + } Class clazz = mappings.get(className); @@ -795,7 +799,7 @@ public class TypeUtils { try { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); - if (contextClassLoader != null) { + if (contextClassLoader != null && contextClassLoader != classLoader) { clazz = contextClassLoader.loadClass(className); mappings.put(className, clazz); diff --git a/src/test/java/com/alibaba/json/bvt/android/UriTest.java b/src/test/java/com/alibaba/json/bvt/android/UriTest.java new file mode 100644 index 000000000..9bcb66932 --- /dev/null +++ b/src/test/java/com/alibaba/json/bvt/android/UriTest.java @@ -0,0 +1,24 @@ +package com.alibaba.json.bvt.android; + +import android.net.Uri; +import com.alibaba.fastjson.JSON; +import junit.framework.TestCase; + +/** + * Created by wenshao on 23/02/2017. + */ +public class UriTest extends TestCase { + public void test_android_uri() throws Exception { + Uri uri = Uri.parse("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png"); + String str = JSON.toJSONString(uri); + + assertEquals("\"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png\"", str); + + Uri uri2 = JSON.parseObject(str, Uri.class); + + } + + public static class Model { + + } +}