From e491349b817ebcdda769c76e6d2fc8afcc0c912a Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 16 Jun 2022 17:49:37 +0800 Subject: [PATCH] fix code --- .../core/convert/impl/ArrayConverter.java | 2 +- .../core/convert/impl/DateConverter.java | 6 +- .../src/main/java/cn/hutool/json/JSON.java | 49 ++++++------ .../main/java/cn/hutool/json/JSONArray.java | 4 +- .../java/cn/hutool/json/JSONBeanParser.java | 3 +- .../java/cn/hutool/json/JSONConverter.java | 66 +++++++++++++---- .../main/java/cn/hutool/json/JSONGetter.java | 74 ++----------------- .../main/java/cn/hutool/json/JSONObject.java | 4 +- .../main/java/cn/hutool/json/JSONUtil.java | 62 ++++++---------- .../main/java/cn/hutool/json/jwt/Claims.java | 2 +- .../src/main/java/cn/hutool/json/jwt/JWT.java | 15 +++- .../json/serialize/JSONDeserializer.java | 10 +-- .../java/cn/hutool/json/Issue2369Test.java | 2 +- .../java/cn/hutool/json/Issue2377Test.java | 2 +- .../java/cn/hutool/json/Issue488Test.java | 17 ++--- .../java/cn/hutool/json/JSONObjectTest.java | 20 ++++- .../json/issueIVMD5/IssueIVMD5Test.java | 14 ++-- .../test/java/cn/hutool/json/jwt/JWTTest.java | 71 ++++++++++++++++++ 18 files changed, 239 insertions(+), 184 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java index 739e372e3..86862b553 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ArrayConverter.java @@ -48,7 +48,7 @@ public class ArrayConverter extends AbstractConverter { } @Override - protected Object convertInternal(Class targetClass, final Object value) { + protected Object convertInternal(final Class targetClass, final Object value) { final Class targetComponentType; if (targetClass.isArray()) { targetComponentType = targetClass.getComponentType(); diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java index e6ee1a5a7..be6635a7a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java @@ -59,7 +59,7 @@ public class DateConverter extends AbstractConverter { } @Override - protected java.util.Date convertInternal(Class targetClass, final Object value) { + protected java.util.Date convertInternal(final Class targetClass, final Object value) { if (value == null || (value instanceof CharSequence && StrUtil.isBlank(value.toString()))) { return null; } @@ -89,7 +89,7 @@ public class DateConverter extends AbstractConverter { * @param date Date * @return 目标类型对象 */ - private java.util.Date wrap(Class targetClass, final DateTime date) { + private java.util.Date wrap(final Class targetClass, final DateTime date) { // 返回指定类型 if (java.util.Date.class == targetClass) { return date.toJdkDate(); @@ -116,7 +116,7 @@ public class DateConverter extends AbstractConverter { * @param mills Date * @return 目标类型对象 */ - private java.util.Date wrap(Class targetClass, final long mills) { + private java.util.Date wrap(final Class targetClass, final long mills) { // 返回指定类型 if (java.util.Date.class == targetClass) { return new java.util.Date(mills); diff --git a/hutool-json/src/main/java/cn/hutool/json/JSON.java b/hutool-json/src/main/java/cn/hutool/json/JSON.java index e06aaa72c..9a0345ede 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSON.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSON.java @@ -15,6 +15,14 @@ import java.lang.reflect.Type; */ public interface JSON extends Cloneable, Serializable { + /** + * 获取JSON配置 + * + * @return {@link JSONConfig} + * @since 5.3.0 + */ + JSONConfig getConfig(); + /** * 通过表达式获取JSON中嵌套的对象
*
    @@ -36,7 +44,7 @@ public interface JSON extends Cloneable, Serializable { * @see BeanPath#get(Object) * @since 4.0.6 */ - default Object getByPath(String expression){ + default Object getByPath(final String expression){ return BeanPath.of(expression).get(this); } @@ -61,7 +69,7 @@ public interface JSON extends Cloneable, Serializable { * @param expression 表达式 * @param value 值 */ - default void putByPath(String expression, Object value){ + default void putByPath(final String expression, final Object value){ BeanPath.of(expression).set(this, value); } @@ -152,6 +160,18 @@ public interface JSON extends Cloneable, Serializable { return toBean((Type) clazz); } + /** + * 转为实体类对象 + * + * @param Bean类型 + * @param type {@link Type} + * @return 实体类对象 + * @since 4.3.2 + */ + default T toBean(final Type type) { + return JSONConverter.jsonConvert(type, this, getConfig()); + } + /** * 转为实体类对象,转换异常将被抛出 * @@ -163,29 +183,4 @@ public interface JSON extends Cloneable, Serializable { default T toBean(final TypeReference reference) { return toBean(reference.getType()); } - - /** - * 转为实体类对象 - * - * @param Bean类型 - * @param type {@link Type} - * @return 实体类对象 - * @since 3.0.8 - */ - default T toBean(final Type type) { - return toBean(type, false); - } - - /** - * 转为实体类对象 - * - * @param Bean类型 - * @param type {@link Type} - * @param ignoreError 是否忽略转换错误 - * @return 实体类对象 - * @since 4.3.2 - */ - default T toBean(final Type type, final boolean ignoreError) { - return JSONConverter.jsonConvert(type, this, ignoreError); - } } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java index 5a04ac89e..a7cd482f0 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONArray.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONArray.java @@ -193,7 +193,7 @@ public class JSONArray implements JSON, JSONGetter, List, Rando @Override public T getByPath(final String expression, final Class resultType) { - return JSONConverter.jsonConvert(resultType, getByPath(expression), this.config.isIgnoreError()); + return JSONConverter.jsonConvert(resultType, getByPath(expression), getConfig()); } /** @@ -237,7 +237,7 @@ public class JSONArray implements JSON, JSONGetter, List, Rando @Override public T toBean(final Type type) { - return JSON.super.toBean(type, config.isIgnoreError()); + return JSON.super.toBean(type); } /** diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONBeanParser.java b/hutool-json/src/main/java/cn/hutool/json/JSONBeanParser.java index 6c9c1212a..d7cb71125 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONBeanParser.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONBeanParser.java @@ -1,7 +1,8 @@ package cn.hutool.json; /** - * 实现此接口的类可以通过实现{@code parse(value)}方法来将JSON中的值解析为此对象的值 + * 实现此接口的类可以通过实现{@code parse(value)}方法来将JSON中的值解析为此对象的值
    + * 此接口主要用于可以自定义的Bean对象,而无需全局配置转换器。 * * @author Looly * @since 5.7.8 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java index 990d902bb..cd38d0734 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONConverter.java @@ -7,6 +7,8 @@ import cn.hutool.core.convert.ConvertException; import cn.hutool.core.convert.Converter; import cn.hutool.core.convert.ConverterRegistry; import cn.hutool.core.convert.impl.BeanConverter; +import cn.hutool.core.convert.impl.DateConverter; +import cn.hutool.core.convert.impl.TemporalAccessorConverter; import cn.hutool.core.reflect.ConstructorUtil; import cn.hutool.core.reflect.TypeUtil; import cn.hutool.core.text.StrUtil; @@ -15,6 +17,8 @@ import cn.hutool.json.serialize.GlobalSerializeMapping; import cn.hutool.json.serialize.JSONDeserializer; import java.lang.reflect.Type; +import java.time.temporal.TemporalAccessor; +import java.util.Date; /** * JSON转换器 @@ -35,7 +39,7 @@ public class JSONConverter implements Converter { } @Override - public Object convert(Type targetType, Object value) throws ConvertException { + public Object convert(final Type targetType, final Object value) throws ConvertException { return JSONUtil.parse(value); } @@ -47,38 +51,60 @@ public class JSONConverter implements Converter { * @param 转换后的对象类型 * @param targetType 目标类型 * @param value 值 - * @param ignoreError 是否忽略转换错误 + * @param config JSON配置项 * @return 目标类型的值 * @throws ConvertException 转换失败 */ @SuppressWarnings("unchecked") - protected static T jsonConvert(final Type targetType, final Object value, final boolean ignoreError) throws ConvertException { + protected static T jsonConvert(final Type targetType, final Object value, final JSONConfig config) throws ConvertException { if (null == value) { return null; } - // since 5.7.8,增加自定义Bean反序列化接口 + // since 5.7.8,增加自定义Bean反序列化接口和特殊对象的自定义转换 if(targetType instanceof Class){ - final Class clazz = (Class) targetType; - if (JSONBeanParser.class.isAssignableFrom(clazz)){ + final Class targetClass = (Class) targetType; + if(targetClass.isInstance(value)){ + return (T) value; + } + + if (JSONBeanParser.class.isAssignableFrom(targetClass)){ + // 自定义对象转换 @SuppressWarnings("rawtypes") - final JSONBeanParser target = (JSONBeanParser) ConstructorUtil.newInstanceIfPossible(clazz); + final JSONBeanParser target = (JSONBeanParser) ConstructorUtil.newInstanceIfPossible(targetClass); if(null == target){ throw new ConvertException("Can not instance [{}]", targetType); } target.parse(value); return (T) target; - } else if(targetType == byte[].class && value instanceof CharSequence){ + } else if(targetClass == byte[].class && value instanceof CharSequence){ + // bytes二进制反序列化,默认按照Base64对待 // issue#I59LW4 return (T) Base64.decode((CharSequence) value); + }else if(targetClass.isAssignableFrom(Date.class) || targetClass.isAssignableFrom(TemporalAccessor.class)){ + // 用户指定了日期格式,获取日期属性时使用对应格式 + final String valueStr = Convert.toStr(value); + if (null == valueStr) { + return null; + } + + // 日期转换,支持自定义日期格式 + final String format = getDateFormat(config); + if(null != format){ + if(targetClass.isAssignableFrom(Date.class)){ + return (T) new DateConverter(format).convert(targetClass, valueStr); + }else{ + return (T) new TemporalAccessorConverter(format).convert(targetClass, valueStr); + } + } } } - return jsonToBean(targetType, value, ignoreError); + return jsonToBean(targetType, value, null != config && config.isIgnoreError()); } /** - * JSON递归转换
    + * JSON递归转换为Bean
    * 首先尝试JDK类型转换,如果失败尝试JSON转Bean * * @param 转换后的对象类型 @@ -103,9 +129,8 @@ public class JSONConverter implements Converter { // issue#2212@Github // 在JSONObject转Bean时,读取JSONObject本身的配置文件 - if(value instanceof JSONGetter - && targetType instanceof Class && BeanUtil.hasSetter((Class) targetType)){ - final JSONConfig config = ((JSONGetter) value).getConfig(); + if(targetType instanceof Class && BeanUtil.hasSetter((Class) targetType)){ + final JSONConfig config = ((JSON) value).getConfig(); final Converter converter = new BeanConverter(InternalJSONUtil.toCopyOptions(config).setIgnoreError(ignoreError)); return ignoreError ? converter.convert(targetType, value, null) : (T) converter.convert(targetType, value); @@ -126,4 +151,19 @@ public class JSONConverter implements Converter { return targetValue; } + + /** + * 获取配置文件中的日期格式,无格式返回{@code null} + * @param config JSON配置 + * @return 日期格式,无返回{@code null} + */ + private static String getDateFormat(final JSONConfig config){ + if(null != config){ + final String format = config.getDateFormat(); + if (StrUtil.isNotBlank(format)) { + return format; + } + } + return null; + } } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java index 5efbdf656..bbd8e82d3 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONGetter.java @@ -1,17 +1,12 @@ package cn.hutool.json; -import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.ConvertException; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.getter.OptNullBasicTypeFromObjectGetter; -import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.ObjUtil; import java.time.LocalDateTime; import java.util.Date; import java.util.List; -import java.util.Optional; /** * 用于JSON的Getter类,提供各种类型的Getter方法 @@ -132,29 +127,7 @@ public interface JSONGetter extends OptNullBasicTypeFromObjectGetter { @Override default Date getDate(final K key, final Date defaultValue) { - // 默认转换 - final Object obj = getObj(key); - if (ObjUtil.isNull(obj)) { - return defaultValue; - } - if (obj instanceof Date) { - return (Date) obj; - } - - final Optional formatOps = Optional.ofNullable(getConfig()).map(JSONConfig::getDateFormat); - if (formatOps.isPresent()) { - final String format = formatOps.get(); - if (StrUtil.isNotBlank(format)) { - // 用户指定了日期格式,获取日期属性时使用对应格式 - final String str = Convert.toStr(obj); - if (null == str) { - return defaultValue; - } - return DateUtil.parse(str, format); - } - } - - return Convert.toDate(obj, defaultValue); + return get(key, Date.class); } /** @@ -166,29 +139,7 @@ public interface JSONGetter extends OptNullBasicTypeFromObjectGetter { * @since 5.7.7 */ default LocalDateTime getLocalDateTime(final K key, final LocalDateTime defaultValue) { - // 默认转换 - final Object obj = getObj(key); - if (ObjUtil.isNull(obj)) { - return defaultValue; - } - if (obj instanceof LocalDateTime) { - return (LocalDateTime) obj; - } - - final Optional formatOps = Optional.ofNullable(getConfig()).map(JSONConfig::getDateFormat); - if (formatOps.isPresent()) { - final String format = formatOps.get(); - if (StrUtil.isNotBlank(format)) { - // 用户指定了日期格式,获取日期属性时使用对应格式 - final String str = Convert.toStr(obj); - if (null == str) { - return defaultValue; - } - return LocalDateTimeUtil.parse(str, format); - } - } - - return Convert.toLocalDateTime(obj, defaultValue); + return ObjUtil.defaultIfNull(get(key, LocalDateTime.class), defaultValue); } /** @@ -201,37 +152,22 @@ public interface JSONGetter extends OptNullBasicTypeFromObjectGetter { return get(key, byte[].class); } - /** - * 获取指定类型的对象
    - * 转换失败或抛出异常 - * - * @param 获取的对象类型 - * @param key 键 - * @param type 获取对象类型 - * @return 对象 - * @throws ConvertException 转换异常 - * @since 3.0.8 - */ - default T get(final K key, final Class type) throws ConvertException { - return get(key, type, false); - } - /** * 获取指定类型的对象 * * @param 获取的对象类型 * @param key 键 * @param type 获取对象类型 - * @param ignoreError 是否跳过转换失败的对象或值 * @return 对象 * @throws ConvertException 转换异常 * @since 3.0.8 */ - default T get(final K key, final Class type, final boolean ignoreError) throws ConvertException { + default T get(final K key, final Class type) throws ConvertException { final Object value = this.getObj(key); if (ObjUtil.isNull(value)) { return null; } - return JSONConverter.jsonConvert(type, value, ignoreError); + + return JSONConverter.jsonConvert(type, value, getConfig()); } } diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java index 99be5b560..7db6f17a8 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONObject.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONObject.java @@ -151,7 +151,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON @Override public T toBean(final Type type) { - return JSON.super.toBean(type, this.config.isIgnoreError()); + return JSON.super.toBean(type); } /** @@ -183,7 +183,7 @@ public class JSONObject extends MapWrapper implements JSON, JSON @Override public T getByPath(final String expression, final Class resultType) { - return JSONConverter.jsonConvert(resultType, getByPath(expression), this.config.isIgnoreError()); + return JSONConverter.jsonConvert(resultType, getByPath(expression), getConfig()); } /** diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java index 8bc60e160..06fb24fcf 100755 --- a/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONUtil.java @@ -382,7 +382,7 @@ public class JSONUtil { * @since 3.1.2 */ public static T toBean(final String jsonString, final Class beanClass) { - return toBean(parseObj(jsonString), beanClass); + return toBean(parse(jsonString), beanClass); } /** @@ -397,7 +397,21 @@ public class JSONUtil { * @since 5.8.0 */ public static T toBean(final String jsonString, final JSONConfig config, final Class beanClass) { - return toBean(parseObj(jsonString, config), beanClass); + return toBean(parse(jsonString, config), beanClass); + } + + /** + * JSON字符串转为实体类对象,转换异常将被抛出
    + * 通过{@link JSONConfig}可选是否忽略大小写、忽略null等配置 + * + * @param Bean类型 + * @param jsonString JSON字符串 + * @param config JSON配置 + * @param type Bean类型 + * @return 实体类对象 + */ + public static T toBean(final String jsonString, final JSONConfig config, final Type type) { + return toBean(parse(jsonString, config), type); } /** @@ -412,63 +426,33 @@ public class JSONUtil { return null == json ? null : json.toBean(beanClass); } - /** - * JSON字符串转为实体类对象,转换异常将被抛出 - * - * @param Bean类型 - * @param jsonString JSON字符串 - * @param typeReference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型 - * @param ignoreError 是否忽略错误 - * @return 实体类对象 - * @since 4.3.2 - */ - public static T toBean(final String jsonString, final TypeReference typeReference, final boolean ignoreError) { - return toBean(jsonString, typeReference.getType(), ignoreError); - } - - /** - * JSON字符串转为实体类对象,转换异常将被抛出 - * - * @param Bean类型 - * @param jsonString JSON字符串 - * @param beanType 实体类对象类型 - * @param ignoreError 是否忽略错误 - * @return 实体类对象 - * @since 4.3.2 - */ - public static T toBean(final String jsonString, final Type beanType, final boolean ignoreError) { - return parse(jsonString, JSONConfig.of().setIgnoreError(ignoreError)).toBean(beanType); - } - /** * 转为实体类对象 * * @param Bean类型 * @param json JSONObject * @param typeReference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型 - * @param ignoreError 是否忽略转换错误 * @return 实体类对象 * @since 4.6.2 */ - public static T toBean(final JSON json, final TypeReference typeReference, final boolean ignoreError) { - return toBean(json, typeReference.getType(), ignoreError); + public static T toBean(final JSON json, final TypeReference typeReference) { + return toBean(json, typeReference.getType()); } /** * 转为实体类对象 * - * @param Bean类型 - * @param json JSONObject - * @param beanType 实体类对象类型 - * @param ignoreError 是否忽略转换错误 + * @param Bean类型 + * @param json JSONObject + * @param beanType 实体类对象类型 * @return 实体类对象 * @since 4.3.2 */ - public static T toBean(final JSON json, final Type beanType, final boolean ignoreError) { + public static T toBean(final JSON json, final Type beanType) { if (null == json) { return null; } - return json.toBean(beanType, ignoreError); + return json.toBean(beanType); } // -------------------------------------------------------------------- toBean end diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java b/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java index aade47c62..88c590d23 100755 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/Claims.java @@ -32,8 +32,8 @@ public class Claims implements Serializable { * @param value 属性值 */ protected void setClaim(final String name, final Object value) { - init(); Assert.notNull(name, "Name must be not null!"); + init(); if (value == null) { claimJSON.remove(name); return; diff --git a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java index 97aa2f683..145cd6cd5 100755 --- a/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java +++ b/hutool-json/src/main/java/cn/hutool/json/jwt/JWT.java @@ -5,9 +5,9 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ValidateException; import cn.hutool.core.lang.Assert; +import cn.hutool.core.text.StrUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.text.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.jwt.signers.AlgorithmUtil; import cn.hutool.json.jwt.signers.JWTSigner; @@ -266,6 +266,19 @@ public class JWT implements RegisteredPayload { return getPayload().getClaim(name); } + /** + * 获取payload并获取类型 + * + * @param propertyName 需要提取的属性名称 + * @param propertyType 需要提取的属性类型 + * @return 载荷信息 + * @throws ValidateException 传入的类型不匹配payload类型 + * @since 6.0.0 + */ + public T getPayload(final String propertyName, final Class propertyType) { + return getPayload().getClaimsJson().get(propertyName, propertyType); + } + /** * 设置JWT载荷信息 * diff --git a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONDeserializer.java b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONDeserializer.java index d759a88e4..0c1c49793 100644 --- a/hutool-json/src/main/java/cn/hutool/json/serialize/JSONDeserializer.java +++ b/hutool-json/src/main/java/cn/hutool/json/serialize/JSONDeserializer.java @@ -3,18 +3,18 @@ package cn.hutool.json.serialize; import cn.hutool.json.JSON; /** - * JSON反序列话自定义实现类 - * - * @author Looly + * JSON自定义反序列化接口
    + * 此接口主要针对一些特殊对象的反序列化自定义转换规则,配合GlobalSerializeMapping,可以全局设定某一类对象的自定义转换,而无需修改发Bean的结构。 * * @param 反序列化后的类型 + * @author Looly */ @FunctionalInterface public interface JSONDeserializer { - + /** * 反序列化,通过实现此方法,自定义实现JSON转换为指定类型的逻辑 - * + * * @param json {@link JSON} * @return 目标对象 */ diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java index be9c1f8bd..ab376228b 100644 --- a/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2369Test.java @@ -13,7 +13,7 @@ public class Issue2369Test { final String s = JSONUtil.toJsonStr(bytes); Assert.assertEquals("[10,11]", s); - final Object o = JSONUtil.toBean(s, byte[].class, false); + final Object o = JSONUtil.toBean(s, byte[].class); Assert.assertArrayEquals(bytes, (byte[])o); } } diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java index a95d0841c..dc7c84a78 100644 --- a/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue2377Test.java @@ -17,7 +17,7 @@ public class Issue2377Test { final String paramBytesStr = JSONUtil.toJsonStr(paramList.get(1)); Assert.assertEquals("[10,11]", paramBytesStr); - final byte[] paramBytes = JSONUtil.toBean(paramBytesStr, byte[].class, false); + final byte[] paramBytes = JSONUtil.toBean(paramBytesStr, byte[].class); Assert.assertArrayEquals((byte[]) paramArray[1], paramBytes); } } diff --git a/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java b/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java index f866b8d19..826f821cb 100755 --- a/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/Issue488Test.java @@ -1,13 +1,12 @@ package cn.hutool.json; -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; - import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.reflect.TypeReference; import lombok.Data; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; public class Issue488Test { @@ -15,8 +14,8 @@ public class Issue488Test { public void toBeanTest() { final String jsonStr = ResourceUtil.readUtf8Str("issue488.json"); - final ResultSuccess> result = JSONUtil.toBean(jsonStr, - new TypeReference>>() {}, false); + final ResultSuccess> result = JSONUtil.toBean(jsonStr, JSONConfig.of(), + new TypeReference>>() {}); Assert.assertEquals("https://graph.microsoft.com/beta/$metadata#Collection(microsoft.graph.emailAddress)", result.getContext()); @@ -35,8 +34,8 @@ public class Issue488Test { public void toCollctionBeanTest() { final String jsonStr = ResourceUtil.readUtf8Str("issue488Array.json"); - final List>> resultList = JSONUtil.toBean(jsonStr, - new TypeReference>>>() {}, false); + final List>> resultList = JSONUtil.toBean(jsonStr, JSONConfig.of(), + new TypeReference>>>() {}); final ResultSuccess> result = resultList.get(0); diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java index 50596ac2e..9e7713e25 100755 --- a/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONObjectTest.java @@ -218,14 +218,14 @@ public class JSONObjectTest { @Test public void toBeanNullStrTest() { - final JSONObject json = JSONUtil.createObj()// + final JSONObject json = JSONUtil.createObj(JSONConfig.of().setIgnoreError(true))// .set("strValue", "null")// .set("intValue", 123)// // 子对象对应"null"字符串,如果忽略错误,跳过,否则抛出转换异常 .set("beanValue", "null")// .set("list", JSONUtil.createArray().set("a").set("b")); - final TestBean bean = json.toBean(TestBean.class, true); + final TestBean bean = json.toBean(TestBean.class); // 当JSON中为字符串"null"时应被当作字符串处理 Assert.assertEquals("null", bean.getStrValue()); // 当JSON中为字符串"null"时Bean中的字段类型不匹配应在ignoreError模式下忽略注入 @@ -483,6 +483,22 @@ public class JSONObjectTest { Assert.assertEquals(DateUtil.beginOfDay(date), parse.getDate("date")); } + @Test + public void setDateFormatTest3() { + // 自定义格式为只有秒的时间戳,一版用于JWT + final JSONConfig jsonConfig = JSONConfig.of().setDateFormat("#sss"); + + final Date date = DateUtil.parse("2020-06-05 11:16:11"); + final JSONObject json = new JSONObject(jsonConfig); + json.set("date", date); + + Assert.assertEquals("{\"date\":1591326971}", json.toString()); + + // 解析测试 + final JSONObject parse = JSONUtil.parseObj(json.toString(), jsonConfig); + Assert.assertEquals(date, DateUtil.date(parse.getDate("date"))); + } + @Test public void setCustomDateFormatTest() { final JSONConfig jsonConfig = JSONConfig.of(); diff --git a/hutool-json/src/test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java b/hutool-json/src/test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java index 0400592a0..59c312495 100755 --- a/hutool-json/src/test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java +++ b/hutool-json/src/test/java/cn/hutool/json/issueIVMD5/IssueIVMD5Test.java @@ -1,13 +1,13 @@ package cn.hutool.json.issueIVMD5; -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; - import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.reflect.TypeReference; +import cn.hutool.json.JSONConfig; import cn.hutool.json.JSONUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.util.List; public class IssueIVMD5Test { @@ -19,7 +19,7 @@ public class IssueIVMD5Test { final String jsonStr = ResourceUtil.readUtf8Str("issueIVMD5.json"); final TypeReference> typeReference = new TypeReference>() {}; - final BaseResult bean = JSONUtil.toBean(jsonStr, typeReference.getType(), false); + final BaseResult bean = JSONUtil.toBean(jsonStr, JSONConfig.of(), typeReference.getType()); final StudentInfo data2 = bean.getData2(); Assert.assertEquals("B4DDF491FDF34074AE7A819E1341CB6C", data2.getAccountId()); @@ -33,7 +33,7 @@ public class IssueIVMD5Test { final String jsonStr = ResourceUtil.readUtf8Str("issueIVMD5.json"); final TypeReference> typeReference = new TypeReference>() {}; - final BaseResult bean = JSONUtil.toBean(jsonStr, typeReference.getType(), false); + final BaseResult bean = JSONUtil.toBean(jsonStr, JSONConfig.of(), typeReference.getType()); final List data = bean.getData(); final StudentInfo studentInfo = data.get(0); diff --git a/hutool-json/src/test/java/cn/hutool/json/jwt/JWTTest.java b/hutool-json/src/test/java/cn/hutool/json/jwt/JWTTest.java index a6edf8b0c..04acaab3b 100755 --- a/hutool-json/src/test/java/cn/hutool/json/jwt/JWTTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/jwt/JWTTest.java @@ -1,11 +1,19 @@ package cn.hutool.json.jwt; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.StrUtil; import cn.hutool.json.jwt.signers.JWTSignerUtil; +import lombok.Data; import org.junit.Assert; import org.junit.Test; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class JWTTest { @Test @@ -88,4 +96,67 @@ public class JWTTest { final boolean verify = JWT.of(token).setKey(StrUtil.utf8Bytes("123456")).verify(); Assert.assertTrue(verify); } + + @Data + public static class UserTest { + private String name; + private Integer age; + } + @Test + public void payloadTest() { + + final UserTest bean = new UserTest(); + bean.setAge(18); + bean.setName("takaki"); + + final Date date = new Date(); + final List list = Arrays.asList(1, 2, 3); + final Integer num = 18; + final String username = "takaki"; + final HashMap map = new HashMap<>(); + map.put("test1", "1"); + map.put("test2", "2"); + final Map payload = new HashMap() { + private static final long serialVersionUID = 1L; + { + put("username", username); + put("bean", bean); + put("number", num); + put("list", list); + put("date", date); + put("map", map); + } + }; + + final String token = JWTUtil.createToken(payload, "123".getBytes()); + final JWT jwt = JWT.of(token); + final String strRes = jwt.getPayload("username", String.class); + final UserTest beanRes = jwt.getPayload("bean", UserTest.class); + final Date dateRes = jwt.getPayload("date", Date.class); + final List listRes = jwt.getPayload("list", List.class); + final Integer numRes = jwt.getPayload("number", Integer.class); + final HashMap mapRes = jwt.getPayload("map", HashMap.class); + + Assert.assertEquals(bean, beanRes); + Assert.assertEquals(numRes, num); + Assert.assertEquals(username, strRes); + Assert.assertEquals(list, listRes); + + final String formattedDate = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss"); + final String formattedRes = DateUtil.format(dateRes, "yyyy-MM-dd HH:mm:ss"); + Assert.assertEquals(formattedDate, formattedRes); + Assert.assertEquals(map, mapRes); + } + + @Test() + public void getDateTest(){ + final String token = JWT.create() + .setIssuedAt(DateUtil.parse("2022-02-02")) + .setKey("123456".getBytes()) + .sign(); + + // 签发时间早于被检查的时间 + final Date date = JWT.of(token).getPayload().getClaimsJson().getDate(JWTPayload.ISSUED_AT); + Assert.assertEquals("2022-02-02", DateUtil.format(date, DatePattern.NORM_DATE_PATTERN)); + } }