From 15362a0e670f5b2ac45090a171ddfd3a34778c6b Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Thu, 23 May 2024 06:08:05 +0800 Subject: [PATCH] fix FastJsonHttpMessageConverter dateFormat not work, for issue #2577 --- .../main/java/com/alibaba/fastjson/JSON.java | 62 ++++++++++++++++++- .../spring/FastJsonHttpMessageConverter.java | 18 +++++- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java index dcec668200..9e1cfa2bea 100644 --- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java +++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/JSON.java @@ -97,7 +97,7 @@ public static JSONReader.Context createReadContext(int featuresValue, Feature... return createReadContext(JSONFactory.getDefaultObjectReaderProvider(), featuresValue, features); } - static JSONReader.Context createReadContext(ObjectReaderProvider provider, int featuresValue, Feature... features) { + public static JSONReader.Context createReadContext(ObjectReaderProvider provider, int featuresValue, Feature... features) { for (Feature feature : features) { featuresValue |= feature.mask; } @@ -867,6 +867,32 @@ public static T parseObject(byte[] jsonBytes, Type type, Feature... features } } + public static T parseObject(byte[] jsonBytes, Type type, JSONReader.Context context) { + if (jsonBytes == null) { + return null; + } + + JSONReader jsonReader = JSONReader.of(jsonBytes, context); + + try { + ObjectReader objectReader = jsonReader.getObjectReader(type); + T object = objectReader.readObject(jsonReader, null, null, 0); + if (object != null) { + jsonReader.handleResolveTasks(object); + } + if (!jsonReader.isEnd()) { + throw new JSONException(jsonReader.info("input not end")); + } + return object; + } catch (com.alibaba.fastjson2.JSONException e) { + Throwable cause = e.getCause(); + if (cause == null) { + cause = e; + } + throw new JSONException(e.getMessage(), cause); + } + } + public static T parseObject(byte[] jsonBytes, Type type, SerializeFilter filter, Feature... features) { if (jsonBytes == null) { return null; @@ -2082,6 +2108,40 @@ public static final int writeJSONString( } } + public static final int writeJSONString( + OutputStream os, + Object object, + String dateFormat, + SerializeFilter[] filters, + SerializerFeature... features + ) throws IOException { + JSONWriter.Context context = createWriteContext(SerializeConfig.global, DEFAULT_GENERATE_FEATURE, features); + if (dateFormat != null) { + context.setDateFormat(dateFormat); + } + try (JSONWriter jsonWriter = JSONWriter.ofUTF8(context)) { + for (SerializeFilter filter : filters) { + configFilter(context, filter); + } + + if (object == null) { + jsonWriter.writeNull(); + } else { + jsonWriter.setRootObject(object); + ObjectWriter objectWriter = context.getObjectWriter(object.getClass()); + objectWriter.write(jsonWriter, object, null, null, 0); + } + byte[] bytes = jsonWriter.getBytes(); + os.write(bytes); + return bytes.length; + } catch (com.alibaba.fastjson2.JSONException ex) { + Throwable cause = ex.getCause() != null ? ex.getCause() : ex; + throw new JSONException("writeJSONString error", cause); + } catch (RuntimeException ex) { + throw new JSONException("writeJSONString error", ex); + } + } + public static JSONArray parseArray(String str, Feature... features) { if (str == null || str.isEmpty()) { return null; diff --git a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonHttpMessageConverter.java b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonHttpMessageConverter.java index b2090eb139..a8d5608f24 100644 --- a/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonHttpMessageConverter.java +++ b/fastjson1-compatible/src/main/java/com/alibaba/fastjson/support/spring/FastJsonHttpMessageConverter.java @@ -3,7 +3,9 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.support.config.FastJsonConfig; +import com.alibaba.fastjson2.JSONFactory; import com.alibaba.fastjson2.JSONPObject; +import com.alibaba.fastjson2.JSONReader; import org.springframework.core.ResolvableType; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; @@ -21,6 +23,8 @@ import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; +import static com.alibaba.fastjson.JSON.DEFAULT_PARSER_FEATURE; + /** * Fastjson for Spring MVC Converter. *

@@ -123,7 +127,18 @@ private Object readType(Type type, HttpInputMessage inputMessage) { } byte[] bytes = baos.toByteArray(); - return JSON.parseObject(bytes, type, fastJsonConfig.getFeatures()); + JSONReader.Context context = JSON.createReadContext( + JSONFactory.getDefaultObjectReaderProvider(), + DEFAULT_PARSER_FEATURE, + fastJsonConfig.getFeatures() + ); + + String dateFormat = fastJsonConfig.getDateFormat(); + if (dateFormat != null) { + context.setDateFormat(dateFormat); + } + + return JSON.parseObject(bytes, type, context); } catch (JSONException ex) { throw new HttpMessageNotReadableException("JSON parse error: " + ex.getMessage(), ex); } catch (IOException ex) { @@ -155,6 +170,7 @@ protected void writeInternal( contentLength = JSON.writeJSONString( baos, object, + fastJsonConfig.getDateFormat(), fastJsonConfig.getSerializeFilters(), fastJsonConfig.getSerializerFeatures() );