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方法 * * @param Key类型 * @author Looly */ public interface JSONGetter extends OptNullBasicTypeFromObjectGetter { /** * 获取JSON配置 * * @return {@link JSONConfig} * @since 5.3.0 */ JSONConfig getConfig(); /** * key对应值是否为{@code null}或无此key * * @param key 键 * @return true 无此key或值为{@code null}返回{@code false},其它返回{@code true} */ default boolean isNull(final K key) { return ObjUtil.isNull(this.getObj(key)); } /** * 获取字符串类型值,并转义不可见字符,如'\n'换行符会被转义为字符串"\n" * * @param key 键 * @return 字符串类型值 * @since 4.2.2 */ default String getStrEscaped(final K key) { return getStrEscaped(key, null); } /** * 获取字符串类型值,并转义不可见字符,如'\n'换行符会被转义为字符串"\n" * * @param key 键 * @param defaultValue 默认值 * @return 字符串类型值 * @since 4.2.2 */ default String getStrEscaped(final K key, final String defaultValue) { return JSONUtil.escape(getStr(key, defaultValue)); } /** * 获得JSONArray对象
* 如果值为其它类型对象,尝试转换为{@link JSONArray}返回,否则抛出异常 * * @param key KEY * @return JSONArray对象,如果值为{@code null},返回{@code null},非JSONArray类型,尝试转换,转换失败抛出异常 */ default JSONArray getJSONArray(final K key) { final Object object = this.getObj(key); if (ObjUtil.isNull(object)) { return null; } if (object instanceof JSON) { return (JSONArray) object; } return new JSONArray(object, getConfig()); } /** * 获得JSONObject对象
* 如果值为其它类型对象,尝试转换为{@link JSONObject}返回,否则抛出异常 * * @param key KEY * @return JSONObject对象,如果值为{@code null},返回{@code null},非JSONObject类型,尝试转换,转换失败抛出异常 */ default JSONObject getJSONObject(final K key) { final Object object = this.getObj(key); if (ObjUtil.isNull(object)) { return null; } if (object instanceof JSON) { return (JSONObject) object; } return new JSONObject(object, getConfig()); } /** * 从JSON中直接获取Bean对象
* 先获取JSONObject对象,然后转为Bean对象 * * @param Bean类型 * @param key KEY * @param beanType Bean类型 * @return Bean对象,如果值为null或者非JSONObject类型,返回null * @since 3.1.1 */ default T getBean(final K key, final Class beanType) { final JSONObject obj = getJSONObject(key); return (null == obj) ? null : obj.toBean(beanType); } /** * 从JSON中直接获取Bean的List列表
* 先获取JSONArray对象,然后转为Bean的List * * @param Bean类型 * @param key KEY * @param beanType Bean类型 * @return Bean的List,如果值为null或者非JSONObject类型,返回null * @since 5.7.20 */ default List getBeanList(final K key, final Class beanType) { final JSONArray jsonArray = getJSONArray(key); return (null == jsonArray) ? null : jsonArray.toList(beanType); } @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); } /** * 获取{@link LocalDateTime}类型值 * * @param key 键 * @param defaultValue 默认值 * @return {@link LocalDateTime} * @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); } /** * 获取byte[]数据 * * @param key 键 * @return 值 */ default byte[] getBytes(final K key) { 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 { final Object value = this.getObj(key); if (ObjUtil.isNull(value)) { return null; } return JSONConverter.jsonConvert(type, value, ignoreError); } }