diff --git a/bom/pom.xml b/bom/pom.xml index a97d8cc8f..556c4f14f 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -60,6 +60,7 @@ true true + 1.2.83 @@ -444,6 +445,11 @@ sofa-common-tools ${sofa.common.tools.version} + + com.alibaba + fastjson + ${fastjson.version} + commons-lang commons-lang diff --git a/core/common/pom.xml b/core/common/pom.xml index 643f4866d..1cee02320 100644 --- a/core/common/pom.xml +++ b/core/common/pom.xml @@ -34,6 +34,11 @@ slf4j-log4j12 test + + + com.alibaba + fastjson + diff --git a/core/common/src/main/java/com/alipay/sofa/rpc/common/utils/FastjsonUtils.java b/core/common/src/main/java/com/alipay/sofa/rpc/common/utils/FastjsonUtils.java new file mode 100644 index 000000000..8b2c6e7a2 --- /dev/null +++ b/core/common/src/main/java/com/alipay/sofa/rpc/common/utils/FastjsonUtils.java @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.rpc.common.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONException; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONPath; +import com.alibaba.fastjson.TypeReference; +import com.alibaba.fastjson.parser.Feature; +import com.alibaba.fastjson.parser.ParserConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; + +import java.lang.reflect.Type; + +/** + * Fastjson 工具类 + * + * @author chengming + * @version FastjsonUtils.java, v 0.1 2024年03月14日 1:36 PM chengming + */ +public class FastjsonUtils { + + private static final ParserConfig safeParserConfig = new ParserConfig(); + + public FastjsonUtils() { + } + + public static ParserConfig getSafeInstance() { + return safeParserConfig; + } + + public String toJSONString(Object obj) { + return JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect); + } + + public T toJavaObject(String json, Type type) { + return JSON.parseObject(json, type); + } + + public static JSONObject parseObject(String text) { + Object obj = JSON.parse(text, safeParserConfig); + if (obj instanceof JSONObject) { + return (JSONObject) obj; + } else { + try { + return (JSONObject) JSON.toJSON(obj); + } catch (RuntimeException var3) { + throw new JSONException("can not cast to JSONObject.", var3); + } + } + } + + public static T parseObject(String text, Class clazz) { + return JSON.parseObject(text, clazz, safeParserConfig, null, JSON.DEFAULT_PARSER_FEATURE, new Feature[0]); + } + + public static T parseObject(String text, TypeReference type, Feature... features) { + return JSON.parseObject(text, type.getType(), safeParserConfig, JSON.DEFAULT_PARSER_FEATURE, features); + } + + public static Object read(String json, String path) { + return JSONPath.compile(path).eval(JSON.parse(json, safeParserConfig)); + } + + static { + safeParserConfig.setSafeMode(true); + } +} \ No newline at end of file diff --git a/core/common/src/test/java/com/alipay/sofa/rpc/common/utils/FastjsonUtilsTest.java b/core/common/src/test/java/com/alipay/sofa/rpc/common/utils/FastjsonUtilsTest.java new file mode 100644 index 000000000..3a5f3f760 --- /dev/null +++ b/core/common/src/test/java/com/alipay/sofa/rpc/common/utils/FastjsonUtilsTest.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alipay.sofa.rpc.common.utils; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import org.junit.Before; +import org.junit.Test; + +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class FastjsonUtilsTest { + + private FastjsonUtils fastjsonUtilsTest; + + @Before + public void setUp() throws Exception { + fastjsonUtilsTest = new FastjsonUtils(); + } + + @Test + public void testToJSONString() { + assertEquals("obj", fastjsonUtilsTest.toJSONString("obj")); + } + + @Test + public void testToJSONStringWithObject() { + assertEquals("{\"age\":1,\"name\":\"name\"}", fastjsonUtilsTest.toJSONString(new TestClass(1, "name"))); + } + + @Test + public void testParseObject() { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("age", 1); + jsonObject.put("name", "name"); + assertEquals(jsonObject, FastjsonUtils.parseObject("{\"age\":1,\"name\":\"name\"}")); + } + + @Test + public void testParseObjectWithObject() { + TestClass testClass = FastjsonUtils.parseObject("{\"age\":1,\"name\":\"name\"}", TestClass.class); + assertEquals(1, testClass.age); + assertEquals("name", testClass.name); + } + + @Test + public void testParseObjectWithMap() { + Map map = FastjsonUtils.parseObject("{\"age\":1,\"name\":\"name\"}", + new TypeReference>() { + }); + assertEquals("1", map.get("age")); + assertEquals("name", map.get("name")); + } + + public static class TestClass { + int age; + + String name; + + public TestClass(int age, String name) { + this.age = age; + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +}