当前位置: 首页 > news >正文

实现一个JSON工具类自动处理JSON转String

文章目录

      • 核心功能说明
      • 输出结果
      • 注意事项

以下是一个自定义的JSON工具类 JsonUtils,实现了对象到JSON字符串的转换,并能自动处理常见类型的格式转换(包括基本类型、字符串、日期、集合、数组、枚举、自定义对象等):

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Collection;
import java.lang.reflect.Array;/*** 自定义JSON工具类,实现对象到JSON字符串的转换*/
public class JsonUtils {// 日期格式化器(线程安全处理:局部变量)private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";/*** 将对象转换为JSON字符串* @param obj 待转换的对象* @return JSON格式字符串*/public static String toJsonString(Object obj) {if (obj == null) {return "null";}// 处理基本类型及其包装类if (obj instanceof Number || obj instanceof Boolean) {return obj.toString();}// 处理字符串if (obj instanceof String) {return escapeString((String) obj);}// 处理日期类型if (obj instanceof Date) {return formatDate((Date) obj);}// 处理枚举类型if (obj instanceof Enum) {return escapeString(((Enum<?>) obj).name());}// 处理数组if (obj.getClass().isArray()) {return handleArray(obj);}// 处理集合(List/Set等)if (obj instanceof Collection<?>) {return handleCollection((Collection<?>) obj);}// 处理Mapif (obj instanceof Map<?, ?>) {return handleMap((Map<?, ?>) obj);}// 处理自定义对象(通过反射获取字段)return handleObject(obj);}/*** 处理字符串转义(符合JSON规范)* 转义双引号、反斜杠、控制字符等*/private static String escapeString(String s) {if (s == null) {return "null";}StringBuilder sb = new StringBuilder();sb.append("\""); // 字符串起始引号for (char c : s.toCharArray()) {switch (c) {case '"':sb.append("\\\"");break;case '\\':sb.append("\\\\");break;case '\b':sb.append("\\b");break;case '\f':sb.append("\\f");break;case '\n':sb.append("\\n");break;case '\r':sb.append("\\r");break;case '\t':sb.append("\\t");break;default:// 非ASCII字符转义为Unicodeif (c < 32 || c > 126) {sb.append(String.format("\\u%04x", (int) c));} else {sb.append(c);}}}sb.append("\""); // 字符串结束引号return sb.toString();}/*** 格式化日期为指定字符串*/private static String formatDate(Date date) {SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);return escapeString(sdf.format(date));}/*** 处理数组类型*/private static String handleArray(Object array) {StringBuilder sb = new StringBuilder("[");int length = Array.getLength(array);for (int i = 0; i < length; i++) {Object element = Array.get(array, i);sb.append(toJsonString(element));if (i != length - 1) {sb.append(", "); // 最后一个元素后不加逗号}}sb.append("]");return sb.toString();}/*** 处理集合类型(List/Set等)*/private static String handleCollection(Collection<?> collection) {StringBuilder sb = new StringBuilder("[");int index = 0;for (Object element : collection) {sb.append(toJsonString(element));if (index != collection.size() - 1) {sb.append(", ");}index++;}sb.append("]");return sb.toString();}/*** 处理Map类型*/private static String handleMap(Map<?, ?> map) {StringBuilder sb = new StringBuilder("{");int index = 0;for (Map.Entry<?, ?> entry : map.entrySet()) {Object key = entry.getKey();Object value = entry.getValue();// Map的key转换为JSON字符串键(加引号)sb.append(escapeString(key.toString()));sb.append(": ");sb.append(toJsonString(value));if (index != map.size() - 1) {sb.append(", ");}index++;}sb.append("}");return sb.toString();}/*** 处理自定义对象(通过反射获取字段)*/private static String handleObject(Object obj) {try {StringBuilder sb = new StringBuilder("{");Class<?> clazz = obj.getClass();List<Field> allFields = new ArrayList<>();// 获取所有字段(包括父类,直到Object)while (clazz != null && clazz != Object.class) {allFields.addAll(Arrays.asList(clazz.getDeclaredFields()));clazz = clazz.getSuperclass();}// 过滤掉静态字段和transient字段List<Field> fieldsToProcess = new ArrayList<>();for (Field field : allFields) {int modifiers = field.getModifiers();if (!Modifier.isStatic(modifiers) && !Modifier.isTransient(modifiers)) {fieldsToProcess.add(field);}}// 拼接字段键值对int index = 0;for (Field field : fieldsToProcess) {field.setAccessible(true); // 访问私有字段String fieldName = field.getName();Object fieldValue = field.get(obj);sb.append(escapeString(fieldName)); // 字段名加引号sb.append(": ");sb.append(toJsonString(fieldValue)); // 递归处理字段值if (index != fieldsToProcess.size() - 1) {sb.append(", ");}index++;}sb.append("}");return sb.toString();} catch (IllegalAccessException e) {throw new RuntimeException("转换对象为JSON失败", e);}}
}

核心功能说明

  1. 支持的类型

    • 基本类型及其包装类(int、Integer、boolean、Double等)
    • 字符串(自动转义特殊字符,如双引号、换行符)
    • 日期(Date):默认格式化为yyyy-MM-dd HH:mm:ss
    • 枚举:使用枚举的name()作为值
    • 数组(包括基本类型数组和对象数组)
    • 集合(List、Set等Collection接口实现类)
    • Map(键值对转换为JSON对象)
    • 自定义对象(通过反射获取字段,支持父类字段,排除静态和transient字段)
  2. 使用示例

import java.util.*;
import java.text.ParseException;public class JsonTest {// 自定义测试类static class User {private String name;private int age;private boolean isStudent;private Date birthday;private List<String> hobbies;private int[] scores;private Map<String, Object> info;private Gender gender;// 构造器public User(String name, int age, boolean isStudent, Date birthday,List<String> hobbies, int[] scores, Map<String, Object> info, Gender gender) {this.name = name;this.age = age;this.isStudent = isStudent;this.birthday = birthday;this.hobbies = hobbies;this.scores = scores;this.info = info;this.gender = gender;}}// 枚举测试enum Gender {MALE, FEMALE}public static void main(String[] args) throws ParseException {// 构建测试数据Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse("2000-01-01");List<String> hobbies = Arrays.asList("篮球", "编程", "阅读");int[] scores = {90, 85, 95};Map<String, Object> info = new HashMap<>();info.put("height", 180);info.put("weight", 70.5);info.put("address", "北京市");User user = new User("张三", 23, true, birthday, hobbies, scores, info, Gender.MALE);// 转换为JSON字符串String json = JsonUtils.toJsonString(user);System.out.println(json);}
}

输出结果

{"name": "张三","age": 23,"isStudent": true,"birthday": "2000-01-01 00:00:00","hobbies": ["篮球", "编程", "阅读"],"scores": [90, 85, 95],"info": {"height": 180, "weight": 70.5, "address": "北京市"},"gender": "MALE"
}

注意事项

  1. 该工具类为简化实现,未处理循环引用(如对象A包含对象B,对象B又包含对象A会导致递归栈溢出)。
  2. 日期格式可通过修改DATE_FORMAT常量自定义。
  3. 对于特殊类型(如BigDecimal、LocalDateTime等),可通过添加对应类型的处理逻辑扩展。
  4. 反射处理字段时会访问私有字段,若有特殊权限控制需求需额外处理。
http://www.dtcms.com/a/519348.html

相关文章:

  • 域名注册网站那个好企业服务官网
  • SpringBoot-数据访问之MyBatis与Redis
  • iOS 26 App 运行状况全面解析 多工具协同监控与调试实战指南
  • uts ios插件开发tips
  • 单页营销型网站全国城建中心官方网站
  • 了解sip和rtp是什么
  • MySQL-3-函数应用及多表查询
  • 自然语言处理分享系列-词语和短语的分布式表示及其组合性(二)
  • 网站建设珠海 新盈科技泉州建站模板
  • ISO 8601日期时间标准及其在JavaScript、SQLite与MySQL中的应用解析
  • 利用博客做网站排名南京外贸网站建设案例
  • 使用 VS Code 的 Dev Containers 插件,通过跳板机间接连接docker
  • 衡水城乡建设局网站首页北京网站建设华大
  • 湛江网站建设哪家优惠多常见的网站结构有哪些
  • php网站源码架构seo标题生成器
  • ui设计师与网站编辑有什么关系重庆森林为什么不能看
  • 站长工具成品源码广西贵港建设集团有限公司网站
  • 电子商务网站建设技术解决方案wordpress ios
  • 企业是如何做电子商务网站软件开发培训机构去学
  • 摄影网站策划书wordpress 赞 分享
  • 深圳我的网站深圳市工程交易服务网宝安
  • php制作wap网站开发我国酒店网站建设存在的问题
  • 金坛网站建设企业手机网站建设渠道
  • 做网站要不要钱东莞网站快速优化排名
  • 做微信营销网站建设dw个人简历网页制作
  • 建个免费的销售网站好asp net4.0网站开发
  • 给个能看的网站中国500强企业名称
  • 网站一般用什么免费字体云主机wordpress
  • 旅游网站流程图电子商务网站开发的视频
  • 网站集约化建设流程专业网站建设价位