org.dromara.hutool.json.JSONUtil Maven / Gradle / Ivy
/*
* Copyright (c) 2013-2024 Hutool Team and hutool.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.dromara.hutool.json;
import org.dromara.hutool.core.convert.ConvertUtil;
import org.dromara.hutool.core.io.IORuntimeException;
import org.dromara.hutool.core.io.file.FileUtil;
import org.dromara.hutool.core.lang.Assert;
import org.dromara.hutool.core.reflect.TypeReference;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.hutool.json.convert.JSONConverter;
import org.dromara.hutool.json.serialize.GlobalSerializeMapping;
import org.dromara.hutool.json.serialize.JSONArraySerializer;
import org.dromara.hutool.json.serialize.JSONDeserializer;
import org.dromara.hutool.json.serialize.JSONObjectSerializer;
import org.dromara.hutool.json.writer.GlobalValueWriters;
import org.dromara.hutool.json.writer.JSONValueWriter;
import org.dromara.hutool.json.writer.JSONWriter;
import org.dromara.hutool.json.xml.JSONXMLUtil;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import java.nio.charset.Charset;
import java.util.List;
/**
* JSON工具类
*
* @author Looly
*/
public class JSONUtil {
// -------------------------------------------------------------------- Pause start
/**
* 创建JSONObject
*
* @return JSONObject
*/
public static JSONObject ofObj() {
return new JSONObject();
}
/**
* 创建JSONObject
*
* @param config JSON配置
* @return JSONObject
* @since 5.2.5
*/
public static JSONObject ofObj(final JSONConfig config) {
return new JSONObject(config);
}
/**
* 创建 JSONArray
*
* @return JSONArray
*/
public static JSONArray ofArray() {
return new JSONArray();
}
/**
* 创建 JSONArray
*
* @param config JSON配置
* @return JSONArray
* @since 5.2.5
*/
public static JSONArray ofArray(final JSONConfig config) {
return new JSONArray(config);
}
/**
* JSON字符串转JSONObject对象
* 此方法会忽略空值,但是对JSON字符串不影响
*
* @param obj Bean对象或者Map
* @return JSONObject
*/
public static JSONObject parseObj(final Object obj) {
return new JSONObject(obj);
}
/**
* JSON字符串转JSONObject对象
* 此方法会忽略空值,但是对JSON字符串不影响
*
* @param obj Bean对象或者Map
* @param config JSON配置
* @return JSONObject
* @since 5.3.1
*/
public static JSONObject parseObj(final Object obj, final JSONConfig config) {
return new JSONObject(obj, config);
}
/**
* JSON字符串转JSONObject对象
*
* @param obj Bean对象或者Map
* @param ignoreNullValue 是否忽略空值,如果source为JSON字符串,不忽略空值
* @return JSONObject
* @since 3.0.9
*/
public static JSONObject parseObj(final Object obj, final boolean ignoreNullValue) {
return new JSONObject(obj, JSONConfig.of().setIgnoreNullValue(ignoreNullValue));
}
/**
* JSON字符串转JSONArray
*
* @param arrayOrCollection 数组或集合对象
* @return JSONArray
* @since 3.0.8
*/
public static JSONArray parseArray(final Object arrayOrCollection) {
return new JSONArray(arrayOrCollection);
}
/**
* JSON字符串转JSONArray
*
* @param arrayOrCollection 数组或集合对象
* @param config JSON配置
* @return JSONArray
* @since 5.3.1
*/
public static JSONArray parseArray(final Object arrayOrCollection, final JSONConfig config) {
return new JSONArray(arrayOrCollection, config);
}
/**
* 转换对象为JSON,如果用户不配置JSONConfig,则JSON的有序与否与传入对象有关。
* 支持的对象:
*
* - String: 转换为相应的对象
* - Array、Iterable、Iterator:转换为JSONArray
* - Bean对象:转为JSONObject
*
*
* @param obj 对象
* @return JSON
*/
public static Object parse(final Object obj) {
return parse(obj, null);
}
/**
* 转换对象为JSON,如果用户不配置JSONConfig,则JSON的有序与否与传入对象有关。
* 支持的对象:
*
* - String: 转换为相应的对象
* - Array、Iterable、Iterator:转换为JSONArray
* - Bean对象:转为JSONObject
*
*
* @param obj 对象
* @param config JSON配置,{@code null}使用默认配置
* @return JSON(JSONObject or JSONArray)
*/
public static Object parse(final Object obj, final JSONConfig config) {
if (null == config) {
return JSONConverter.INSTANCE.toJSON(obj);
}
return JSONConverter.of(config).toJSON(obj);
}
/**
* XML字符串转为JSONObject
*
* @param xmlStr XML字符串
* @return JSONObject
*/
public static JSONObject parseFromXml(final String xmlStr) {
return JSONXMLUtil.toJSONObject(xmlStr);
}
// -------------------------------------------------------------------- Parse end
// -------------------------------------------------------------------- Read start
/**
* 读取JSON
*
* @param file JSON文件
* @param charset 编码
* @return JSON(包括JSONObject和JSONArray)
* @throws IORuntimeException IO异常
*/
public static JSON readJSON(final File file, final Charset charset) throws IORuntimeException {
return (JSON) FileUtil.read(file, charset, JSONUtil::parse);
}
/**
* 读取JSONObject
*
* @param file JSON文件
* @param charset 编码
* @return JSONObject
* @throws IORuntimeException IO异常
*/
public static JSONObject readJSONObject(final File file, final Charset charset) throws IORuntimeException {
return FileUtil.read(file, charset, JSONUtil::parseObj);
}
/**
* 读取JSONArray
*
* @param file JSON文件
* @param charset 编码
* @return JSONArray
* @throws IORuntimeException IO异常
*/
public static JSONArray readJSONArray(final File file, final Charset charset) throws IORuntimeException {
return FileUtil.read(file, charset, JSONUtil::parseArray);
}
// -------------------------------------------------------------------- Read end
// -------------------------------------------------------------------- toString start
/**
* 转换为格式化后的JSON字符串
*
* @param obj Bean对象
* @return JSON字符串
*/
public static String toJsonPrettyStr(Object obj) {
obj = parse(obj);
if (obj instanceof JSON) {
return ((JSON) obj).toStringPretty();
}
return StrUtil.toStringOrNull(obj);
}
/**
* 转换为JSON字符串
*
* @param obj 被转为JSON的对象
* @return JSON字符串
*/
public static String toJsonStr(final Object obj) {
return toJsonStr(obj, (JSONConfig) null);
}
/**
* 转换为JSON字符串
*
* @param obj 被转为JSON的对象
* @param jsonConfig JSON配置
* @return JSON字符串
* @since 5.7.12
*/
public static String toJsonStr(final Object obj, final JSONConfig jsonConfig) {
// 自定义规则,优先级高于全局规则
final JSONValueWriter valueWriter = GlobalValueWriters.get(obj);
if (null != valueWriter) {
final StringWriter stringWriter = new StringWriter();
final JSONWriter jsonWriter = JSONWriter.of(stringWriter, 0, 0, null);
// 用户对象自定义实现了JSONValueWriter接口,理解为需要自定义输出
valueWriter.write(jsonWriter, obj);
return stringWriter.toString();
}
if (null == obj) {
return null;
}
return parse(obj, jsonConfig).toString();
}
/**
* 转换为JSON字符串并写出到writer
*
* @param obj 被转为JSON的对象
* @param writer Writer
* @since 5.3.3
*/
public static void toJsonStr(Object obj, final Writer writer) {
if (null != obj) {
obj = parse(obj);
if (obj instanceof JSON) {
((JSON) obj).write(writer);
}
// 普通值
try {
writer.write(obj.toString());
} catch (final IOException e) {
throw new IORuntimeException(e);
}
}
}
/**
* 转换为XML字符串
*
* @param json JSON
* @return XML字符串
*/
public static String toXmlStr(final JSON json) {
return JSONXMLUtil.toXml(json);
}
/**
* XML转JSONObject
* 转换过程中一些信息可能会丢失,JSON中无法区分节点和属性,相同的节点将被处理为JSONArray。
*
* @param xml XML字符串
* @return JSONObject
* @since 4.0.8
*/
public static JSONObject xmlToJson(final String xml) {
return JSONXMLUtil.toJSONObject(xml);
}
// -------------------------------------------------------------------- toString end
// -------------------------------------------------------------------- toBean start
/**
* 转为实体类对象
*
* @param Bean类型
* @param json JSONObject
* @param clazz 实体类
* @return 实体类对象
* @since 4.6.2
*/
public static T toBean(final Object json, final Class clazz) {
Assert.notNull(clazz);
return toBean(json, (Type)clazz);
}
/**
* 转为实体类对象
*
* @param Bean类型
* @param json JSONObject
* @param typeReference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型
* @return 实体类对象
* @since 4.6.2
*/
public static T toBean(final Object json, final TypeReference typeReference) {
Assert.notNull(typeReference);
return toBean(json, typeReference.getType());
}
/**
* 转为实体类对象
*
* @param Bean类型
* @param json JSONObject
* @param type 实体类对象类型
* @return 实体类对象
* @since 4.3.2
*/
public static T toBean(final Object json, final Type type) {
return toBean(json, null, type);
}
/**
* 转为实体类对象
*
* @param Bean类型
* @param json JSONObject
* @param config JSON配置
* @param type 实体类对象类型
* @return 实体类对象
* @since 4.3.2
*/
public static T toBean(Object json, final JSONConfig config, Type type) {
if (null == json) {
return null;
}
json = parse(json, config);
if (json instanceof JSON) {
if (type instanceof TypeReference) {
type = ((TypeReference) type).getType();
}
return ((JSON) json).toBean(type);
}
//issue#I7CW27,其他类型使用默认转换
return ConvertUtil.convert(type, json);
}
// -------------------------------------------------------------------- toBean end
/**
* 将JSONArray字符串转换为Bean的List,默认为ArrayList
*
* @param Bean类型
* @param jsonArray JSONArray字符串
* @param elementType List中元素类型
* @return List
* @since 5.5.2
*/
public static List toList(final String jsonArray, final Class elementType) {
return toList(parseArray(jsonArray), elementType);
}
/**
* 将JSONArray转换为Bean的List,默认为ArrayList
*
* @param Bean类型
* @param jsonArray {@link JSONArray}
* @param elementType List中元素类型
* @return List
* @since 4.0.7
*/
public static List toList(final JSONArray jsonArray, final Class elementType) {
return null == jsonArray ? null : jsonArray.toList(elementType);
}
/**
* 通过表达式获取JSON中嵌套的对象
*
* - .表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值
* - []表达式,可以获取集合等对象中对应index的值
*
*
* 表达式栗子:
*
*
* persion
* persion.name
* persons[3]
* person.friends[5].name
*
*
* @param json {@link JSON}
* @param expression 表达式
* @return 对象
* @see JSON#getByPath(String)
*/
public static Object getByPath(final JSON json, final String expression) {
return getByPath(json, expression, null);
}
/**
* 通过表达式获取JSON中嵌套的对象
*
* - .表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值
* - []表达式,可以获取集合等对象中对应index的值
*
*
* 表达式栗子:
*
*
* persion
* persion.name
* persons[3]
* person.friends[5].name
*
*
* @param 值类型
* @param json {@link JSON}
* @param expression 表达式
* @param defaultValue 默认值
* @return 对象
* @see JSON#getByPath(String)
* @since 5.6.0
*/
@SuppressWarnings("unchecked")
public static T getByPath(final JSON json, final String expression, final T defaultValue) {
if ((null == json || StrUtil.isBlank(expression))) {
return defaultValue;
}
if (null != defaultValue) {
final Class type = (Class) defaultValue.getClass();
return ObjUtil.defaultIfNull(json.getByPath(expression, type), defaultValue);
}
return (T) json.getByPath(expression);
}
/**
* 格式化JSON字符串,此方法并不严格检查JSON的格式正确与否
*
* @param jsonStr JSON字符串
* @return 格式化后的字符串
* @since 3.1.2
*/
public static String formatJsonStr(final String jsonStr) {
return JSONStrFormatter.INSTANCE.format(jsonStr);
}
/**
* JSON对象是否为空,以下情况返回true
*
* - null
* - {@link JSONArray#isEmpty()}
* - {@link JSONObject#isEmpty()}
*
*
* @param json JSONObject或JSONArray
* @return 是否为空
*/
public static boolean isEmpty(final JSON json) {
if (null == json) {
return true;
}
if (json instanceof JSONObject) {
return ((JSONObject) json).isEmpty();
} else if (json instanceof JSONArray) {
return ((JSONArray) json).isEmpty();
}
return false;
}
/**
* 是否为JSON类型字符串,首尾都为大括号或中括号判定为JSON字符串
*
* @param str 字符串
* @return 是否为JSON类型字符串
* @since 5.7.22
*/
public static boolean isTypeJSON(final String str) {
return isTypeJSONObject(str) || isTypeJSONArray(str);
}
/**
* 是否为JSONObject类型字符串,首尾都为大括号判定为JSONObject字符串
*
* @param str 字符串
* @return 是否为JSON字符串
* @since 5.7.22
*/
public static boolean isTypeJSONObject(final String str) {
if (StrUtil.isBlank(str)) {
return false;
}
return StrUtil.isWrap(StrUtil.trim(str), '{', '}');
}
/**
* 是否为JSONArray类型的字符串,首尾都为中括号判定为JSONArray字符串
*
* @param str 字符串
* @return 是否为JSONArray类型字符串
* @since 5.7.22
*/
public static boolean isTypeJSONArray(final String str) {
if (StrUtil.isBlank(str)) {
return false;
}
return StrUtil.isWrap(StrUtil.trim(str), '[', ']');
}
/**
* 加入自定义的序列化器
*
* @param type 对象类型
* @param serializer 序列化器实现
* @see GlobalSerializeMapping#putSerializer(Type, JSONObjectSerializer)
* @since 6.0.0
*/
public static void putSerializer(final Type type, final JSONObjectSerializer serializer) {
GlobalSerializeMapping.putSerializer(type, serializer);
}
/**
* 加入自定义的序列化器
*
* @param type 对象类型
* @param serializer 序列化器实现
* @see GlobalSerializeMapping#putSerializer(Type, JSONArraySerializer)
* @since 6.0.0
*/
public static void putSerializer(final Type type, final JSONArraySerializer serializer) {
GlobalSerializeMapping.putSerializer(type, serializer);
}
/**
* 加入自定义的反序列化器
*
* @param type 对象类型
* @param deserializer 反序列化器实现
* @see GlobalSerializeMapping#putDeserializer(Type, JSONDeserializer)
* @since 4.6.5
*/
public static void putDeserializer(final Type type, final JSONDeserializer deserializer) {
GlobalSerializeMapping.putDeserializer(type, deserializer);
}
}