* fix adapt result recursively, for issue #3185

* fix rename variable

* fix checkstyle
This commit is contained in:
yanxutao89 2025-05-03 20:08:58 +08:00 committed by GitHub
parent cfa78ff9e2
commit 23ac0978d1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 96 additions and 76 deletions

View File

@ -37,7 +37,8 @@ import java.util.function.Supplier;
public abstract class JSON
implements JSONAware {
private static TimeZone DEFAULT_TIME_ZONE = TimeZone.getDefault();
private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getDefault();
private static final int MAX_LEVEL = 2048;
public static final String VERSION = com.alibaba.fastjson2.JSON.VERSION;
static final Cache CACHE = new Cache();
static final AtomicReferenceFieldUpdater<Cache, char[]> CHARS_UPDATER
@ -45,7 +46,9 @@ public abstract class JSON
public static TimeZone defaultTimeZone = DEFAULT_TIME_ZONE;
public static Locale defaultLocale = Locale.getDefault();
public static String DEFAULT_TYPE_KEY = "@type";
@Deprecated
public static String DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static int DEFAULT_PARSER_FEATURE;
public static int DEFAULT_GENERATE_FEATURE;
@ -158,7 +161,7 @@ public abstract class JSON
context.config(JSONReader.Feature.SupportAutoType);
}
String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
context.setDateFormat(defaultDateFormat);
}
@ -213,7 +216,7 @@ public abstract class JSON
);
JSONReader reader = JSONReader.of(text, context);
String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
context.setDateFormat(defaultDateFormat);
}
@ -1304,7 +1307,7 @@ public abstract class JSON
}
if ((featuresValue & SerializerFeature.WriteDateUseDateFormat.mask) != 0) {
context.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
context.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
}
if ((featuresValue & SerializerFeature.BeanToArray.mask) != 0) {
@ -2304,22 +2307,37 @@ public abstract class JSON
return javaObject;
}
Object json;
try {
json = com.alibaba.fastjson2.JSON.toJSON(javaObject);
return adaptResult(com.alibaba.fastjson2.JSON.toJSON(javaObject));
} catch (com.alibaba.fastjson2.JSONException e) {
throw new JSONException(e.getMessage(), e);
}
if (json instanceof com.alibaba.fastjson2.JSONObject) {
return new JSONObject((com.alibaba.fastjson2.JSONObject) json);
}
if (json instanceof com.alibaba.fastjson2.JSONArray) {
return new JSONArray((com.alibaba.fastjson2.JSONArray) json);
public static Object adaptResult(Object result) {
return adaptResult(result, 0);
}
return json;
private static Object adaptResult(Object result, int level) {
if (level > MAX_LEVEL) {
throw new JSONException("level too large : " + level);
}
if (result instanceof com.alibaba.fastjson2.JSONObject) {
JSONObject jsonObject = new JSONObject();
com.alibaba.fastjson2.JSONObject object = (com.alibaba.fastjson2.JSONObject) result;
for (Map.Entry<String, Object> entry : object.entrySet()) {
jsonObject.put(entry.getKey(), adaptResult(entry.getValue(), level + 1));
}
return jsonObject;
} else if (result instanceof com.alibaba.fastjson2.JSONArray) {
JSONArray jsonArray = new JSONArray();
com.alibaba.fastjson2.JSONArray array = (com.alibaba.fastjson2.JSONArray) result;
for (int i = 0; i < array.size(); ++i) {
jsonArray.set(i, adaptResult(array.get(i), level + 1));
}
return jsonArray;
}
return result;
}
public static Object toJSON(Object javaObject, SerializeConfig config) {

View File

@ -592,17 +592,7 @@ public class JSONArray
@Override
public Object get(int index) {
Object value = list.get(index);
if (value instanceof com.alibaba.fastjson2.JSONObject) {
return new JSONObject((com.alibaba.fastjson2.JSONObject) value);
}
if (value instanceof com.alibaba.fastjson2.JSONArray) {
return new JSONArray((com.alibaba.fastjson2.JSONArray) value);
}
return value;
return adaptResult(list.get(index));
}
/**
@ -845,7 +835,7 @@ public class JSONArray
ObjectReader objectReader = provider.getObjectReader(clazz);
JSONReader jsonReader = JSONReader.of(json);
String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
jsonReader
.getContext()

View File

@ -127,15 +127,7 @@ public class JSONObject
val = map.get(key.toString());
}
if (val instanceof com.alibaba.fastjson2.JSONObject) {
val = new com.alibaba.fastjson.JSONObject((com.alibaba.fastjson2.JSONObject) val);
}
if (val instanceof com.alibaba.fastjson2.JSONArray) {
val = new com.alibaba.fastjson.JSONArray((com.alibaba.fastjson2.JSONArray) val);
}
return val;
return adaptResult(val);
}
public JSONObject getJSONObject(String key) {
@ -249,7 +241,7 @@ public class JSONObject
boolean fieldBased = jsonReader.getContext().isEnabled(JSONReader.Feature.FieldBased);
ObjectReader objectReader = provider.getObjectReader(clazz, fieldBased);
String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
jsonReader
.getContext()
@ -290,7 +282,7 @@ public class JSONObject
ObjectReader objectReader = provider.getObjectReader(type);
JSONReader jsonReader = JSONReader.of(json);
String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
jsonReader
.getContext()
@ -408,7 +400,7 @@ public class JSONObject
boolean fieldBased = jsonReader.getContext().isEnabled(JSONReader.Feature.FieldBased);
ObjectReader objectReader = provider.getObjectReader(type, fieldBased);
String defaultDateFormat = JSON.DEFFAULT_DATE_FORMAT;
String defaultDateFormat = JSON.DEFAULT_DATE_FORMAT;
if (!"yyyy-MM-dd HH:mm:ss".equals(defaultDateFormat)) {
jsonReader
.getContext()

View File

@ -50,23 +50,11 @@ public class JSONPath {
}
public static Object eval(String rootObject, String path) {
Object result = com.alibaba.fastjson2.JSONPath.eval(rootObject, path);
return adaptResult(result);
return JSON.adaptResult(com.alibaba.fastjson2.JSONPath.eval(rootObject, path));
}
public static Object eval(Object rootObject, String path) {
com.alibaba.fastjson2.JSONPath jsonPath = com.alibaba.fastjson2.JSONPath.of(path);
Object result = jsonPath.eval(rootObject);
return adaptResult(result);
}
private static Object adaptResult(Object result) {
if (result instanceof com.alibaba.fastjson2.JSONArray) {
result = new JSONArray((com.alibaba.fastjson2.JSONArray) result);
} else if (result instanceof com.alibaba.fastjson2.JSONObject) {
result = new JSONObject((com.alibaba.fastjson2.JSONObject) result);
}
return result;
return JSON.adaptResult(com.alibaba.fastjson2.JSONPath.of(path).eval(rootObject));
}
public static boolean set(Object rootObject, String path, Object value) {
@ -90,7 +78,7 @@ public class JSONPath {
JSONReader.Context context = JSON.createReadContext(JSON.DEFAULT_PARSER_FEATURE);
JSONReader jsonReader = JSONReader.of(json, context);
Object result = jsonPath.extract(jsonReader);
return adaptResult(result);
return JSON.adaptResult(result);
}
public static boolean remove(Object root, String path) {

View File

@ -57,7 +57,7 @@ public class JSONWriter {
break;
case WriteDateUseDateFormat:
if (state) {
ctx.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
ctx.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
}
break;
case BeanToArray:

View File

@ -196,7 +196,7 @@ public class ParserConfig {
/**
* fieldName,field 先生成fieldName的快照减少之后的findField的轮询
*
* @param clazz
* @param clazz the specified goal class
* @param fieldCacheMap :map&lt;fieldName ,Field&gt;
*/
public static void parserAllFieldToCache(Class<?> clazz, Map<String, Field> fieldCacheMap) {

View File

@ -96,7 +96,7 @@ public class JSONSerializer {
ctx.config(JSONWriter.Feature.IgnoreErrorGetter);
break;
case WriteDateUseDateFormat:
ctx.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
ctx.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
break;
case BeanToArray:
ctx.config(JSONWriter.Feature.BeanToArray);

View File

@ -186,7 +186,7 @@ public class FastJsonConfig {
* @return the dateFormat
*/
public String getDateFormat() {
dateFormat = JSON.DEFFAULT_DATE_FORMAT;
dateFormat = JSON.DEFAULT_DATE_FORMAT;
return dateFormat;
}
@ -194,7 +194,7 @@ public class FastJsonConfig {
* @param dateFormat the dateFormat to set
*/
public void setDateFormat(String dateFormat) {
JSON.DEFFAULT_DATE_FORMAT = dateFormat;
JSON.DEFAULT_DATE_FORMAT = dateFormat;
this.dateFormat = dateFormat;
}

View File

@ -243,7 +243,7 @@ public class FastJsonJsonView
/**
* Set extractValueFromSingleKeyModel.
*
* @param extractValueFromSingleKeyModel
* @param extractValueFromSingleKeyModel extractValueFromSingleKeyModel
*/
public void setExtractValueFromSingleKeyModel(boolean extractValueFromSingleKeyModel) {
this.extractValueFromSingleKeyModel = extractValueFromSingleKeyModel;

View File

@ -335,7 +335,7 @@ public class JSONTest {
Collections.emptyList(),
SerializeConfig.global,
new SerializeFilter[0],
JSON.DEFFAULT_DATE_FORMAT,
JSON.DEFAULT_DATE_FORMAT,
JSON.DEFAULT_GENERATE_FEATURE,
SerializerFeature.BrowserSecure)
)

View File

@ -55,6 +55,6 @@ public class JSONWriterTest {
assertTrue(context.isEnabled(com.alibaba.fastjson2.JSONWriter.Feature.BeanToArray));
writer.config(SerializerFeature.WriteDateUseDateFormat, true);
assertEquals(JSON.DEFFAULT_DATE_FORMAT, context.getDateFormat());
assertEquals(JSON.DEFAULT_DATE_FORMAT, context.getDateFormat());
}
}

View File

@ -22,7 +22,7 @@ public class TimestampTest {
public void test_0() throws Exception {
long millis = 1668216743000L;
SimpleDateFormat format = new SimpleDateFormat(JSON.DEFFAULT_DATE_FORMAT, JSON.defaultLocale);
SimpleDateFormat format = new SimpleDateFormat(JSON.DEFAULT_DATE_FORMAT, JSON.defaultLocale);
format.setTimeZone(JSON.defaultTimeZone);
String text = "\"" + format.format(new Date(millis)) + "\"";
System.out.println(text);
@ -34,14 +34,14 @@ public class TimestampTest {
"\"2022-11-12 00:00:00\"",
JSON.toJSONStringWithDateFormat(
JSON.parseObject(text, java.sql.Date.class),
JSON.DEFFAULT_DATE_FORMAT
JSON.DEFAULT_DATE_FORMAT
)
);
assertEquals(
"\"2022-11-12 09:32:23\"",
JSON.toJSONStringWithDateFormat(
JSON.parseObject(text, java.util.Date.class),
JSON.DEFFAULT_DATE_FORMAT
JSON.DEFAULT_DATE_FORMAT
)
);
}

View File

@ -9,21 +9,21 @@ import java.util.Date;
public class Issue_for_zuojian {
@Test
public void test_for_issue() throws Exception {
JSON.DEFFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
JSON.DEFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
String json = "{\"value\":\"20180131022733000-0800\"}";
JSON.parseObject(json, Model.class);
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
JSON.DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
}
@Test
public void test_for_issue_1() throws Exception {
JSON.DEFFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
JSON.DEFAULT_DATE_FORMAT = "yyyyMMddHHmmssSSSZ";
String json = "{\"value\":\"20180131022733000-0800\"}";
JSONObject object = JSON.parseObject(json);
object.getObject("value", Date.class);
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
JSON.DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
}
public static class Model {

View File

@ -43,7 +43,7 @@ public class Issue2156 {
@Test
public void test_for_issue_time() throws Exception {
java.sql.Time date = java.sql.Time.valueOf("12:13:14");
String str = JSON.toJSONStringWithDateFormat(date, JSON.DEFFAULT_DATE_FORMAT);
String str = JSON.toJSONStringWithDateFormat(date, JSON.DEFAULT_DATE_FORMAT);
assertEquals("\"12:13:14\"", str);
}
}

View File

@ -0,0 +1,32 @@
package com.alibaba.fastjson.issue_3100;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class Issue3185 {
@Test
public void test_jsonpath_array() {
List list1 = new LinkedList();
Map map1 = new HashMap();
Map map2 = new HashMap();
map2.put("id", "123");
map2.put("name", "张三");
list1.add(map2);
map1.put("list1", list1);
JSONObject jsonObject = (JSONObject) JSON.toJSON(map1);
JSONArray jsonArray = (JSONArray) jsonObject.get("list1");
for (Object subJsonObject : jsonArray) {
assertTrue(subJsonObject instanceof JSONObject);
}
}
}

View File

@ -22,7 +22,7 @@ public class Issue3361 {
@BeforeEach
public void setUp() throws Exception {
ORIGIN_JSON_DEFAULT_DATE_FORMAT = JSON.DEFFAULT_DATE_FORMAT;
ORIGIN_JSON_DEFAULT_DATE_FORMAT = JSON.DEFAULT_DATE_FORMAT;
}
@Test
@ -34,8 +34,8 @@ public class Issue3361 {
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(SerializerFeature.WriteMapNullValue);
config.setWriteContentLength(false);
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS";
config.setDateFormat(JSON.DEFFAULT_DATE_FORMAT);
JSON.DEFAULT_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSSSS";
config.setDateFormat(JSON.DEFAULT_DATE_FORMAT);
String string = JSON.toJSONString(model,
config.getSerializeConfig(),
config.getSerializeFilters(),
@ -54,7 +54,7 @@ public class Issue3361 {
@AfterEach
public void tearDown() throws Exception {
JSON.DEFFAULT_DATE_FORMAT = ORIGIN_JSON_DEFAULT_DATE_FORMAT;
JSON.DEFAULT_DATE_FORMAT = ORIGIN_JSON_DEFAULT_DATE_FORMAT;
}
@Getter

View File

@ -51,7 +51,7 @@ public class JSONSerializerTest {
assertTrue(context.isEnabled(com.alibaba.fastjson2.JSONWriter.Feature.BeanToArray));
writer.config(SerializerFeature.WriteDateUseDateFormat, true);
assertEquals(JSON.DEFFAULT_DATE_FORMAT, context.getDateFormat());
assertEquals(JSON.DEFAULT_DATE_FORMAT, context.getDateFormat());
}
@Test

View File

@ -10,15 +10,15 @@ import java.util.Date;
public class Issue2529 {
@Test
public void test() {
final String format = JSON.DEFFAULT_DATE_FORMAT;
final String format = JSON.DEFAULT_DATE_FORMAT;
try {
JSONObject.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
JSONObject.DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
ResultVo rv = ResultVo.sucessReturn("测试Date转换");
String str = JSONObject.toJSONString(rv);
ResultVo rvnew = JSON.parseObject(str, ResultVo.class);
System.out.println(JSONObject.toJSONString(rvnew));
} finally {
JSON.DEFFAULT_DATE_FORMAT = format;
JSON.DEFAULT_DATE_FORMAT = format;
}
}