mirror of https://github.com/alibaba/fastjson2.git
Fix 3185 (#3532)
* fix adapt result recursively, for issue #3185 * fix rename variable * fix checkstyle
This commit is contained in:
parent
cfa78ff9e2
commit
23ac0978d1
|
@ -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);
|
||||
public static Object adaptResult(Object result) {
|
||||
return adaptResult(result, 0);
|
||||
}
|
||||
|
||||
private static Object adaptResult(Object result, int level) {
|
||||
if (level > MAX_LEVEL) {
|
||||
throw new JSONException("level too large : " + level);
|
||||
}
|
||||
|
||||
if (json instanceof com.alibaba.fastjson2.JSONArray) {
|
||||
return new JSONArray((com.alibaba.fastjson2.JSONArray) json);
|
||||
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 json;
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Object toJSON(Object javaObject, SerializeConfig config) {
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -196,7 +196,7 @@ public class ParserConfig {
|
|||
/**
|
||||
* fieldName,field ,先生成fieldName的快照,减少之后的findField的轮询
|
||||
*
|
||||
* @param clazz
|
||||
* @param clazz the specified goal class
|
||||
* @param fieldCacheMap :map<fieldName ,Field>
|
||||
*/
|
||||
public static void parserAllFieldToCache(Class<?> clazz, Map<String, Field> fieldCacheMap) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -243,7 +243,7 @@ public class FastJsonJsonView
|
|||
/**
|
||||
* Set extractValueFromSingleKeyModel.
|
||||
*
|
||||
* @param extractValueFromSingleKeyModel
|
||||
* @param extractValueFromSingleKeyModel extractValueFromSingleKeyModel
|
||||
*/
|
||||
public void setExtractValueFromSingleKeyModel(boolean extractValueFromSingleKeyModel) {
|
||||
this.extractValueFromSingleKeyModel = extractValueFromSingleKeyModel;
|
||||
|
|
|
@ -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)
|
||||
)
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue