Java对象 转 JSON 字符串

Java对象 转 JSON 字符串本案例所有代码均为原创 使用 Java 手写 没有借鉴其他类似工具库和网上论坛博客 也许没有经过充分测试 可能出现未知 bug 因此不建议拿到正式的项目里使用 Java 对象就像一个文件夹一样 没有办法知道其深度 所以采用了递归 性能方面没有测试 个人认为没有特别耗费性能的地方 除非你的对象包含很多层级 它可以支持 null 字符串 数字 日期 集合等多种类型 包括以上类型的多层嵌套 都没有问题 源码不多 如下 importjava lang reflect Field importjava lang

本案例所有代码均为原创,使用Java1.8类库编写,没有借鉴其他类似工具库和网上论坛博客,也许没有经过充分测试,可能出现未知bug,仅供参考学习使用。

Java对象就像一个文件夹一样,没有办法知道其深度,所以采用了递归。

性能方面没有测试,个人认为没有特别耗费性能的地方,除非你的对象包含很多层级。

它可以支持null,字符串,数字、日期、集合、数组以及自定义对象 等多种数据类型,包括以上任意类型的多层嵌套。

另外对于存储基本类型元素的数组而言,实在没有更好的处理办法,因此占用了很多代码行数。

源码不多,如下:

package com.duyi.boot.utils; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.*; / * @author qiaoao * @description: * @date 2021/7/29 18:10 */ public class JsonUtil { 
    private static JsonUtil util = new JsonUtil(); public static String toJsonStr(Object obj) { 
    return util.parseObj(obj, new StringBuilder()); } private String parseObj(Object obj, StringBuilder builder) { 
    if (builder == null) { 
    throw new UnsupportedOperationException("builder can not be null"); } if (obj == null) { 
    return builder.append("\"null\"").toString(); } Class clazz = obj.getClass(); if (Collection.class.isAssignableFrom(clazz)) { 
    Iterator iterator = ((Collection) obj).iterator(); builder.append("["); while (iterator.hasNext()) { 
    parseObj(iterator.next(), builder); if (iterator.hasNext()) builder.append(","); } builder.append("]"); } else if (Map.class.isAssignableFrom(clazz)) { 
    //如果是map,key一定且必须是String类型,如果是对象,给他toString() Map map = ((Map) obj); Iterator iterator = map.keySet().iterator(); builder.append("{"); while (iterator.hasNext()) { 
    Object key = iterator.next(); builder.append("\""); builder.append(key); builder.append("\":"); parseObj(map.get(key), builder); if (iterator.hasNext()) builder.append(","); } builder.append("}"); } else if (clazz.isArray()) { 
    //数组 / * 虽然int[]类型的数组可以通过:Arrays.stream((int[]) obj).boxed().collect(Collectors.toList()); * 转化为集合,但Arrays.stream()方法不支持char[] byte[] boolean[] float[] */ builder.append("["); if (obj instanceof int[]) { 
    arrayHandle((int[]) obj, builder); } else if (obj instanceof byte[]) { 
    arrayHandle((byte[]) obj, builder); } else if (obj instanceof char[]) { 
    arrayHandle((char[]) obj, builder); } else if (obj instanceof long[]) { 
    arrayHandle((long[]) obj, builder); } else if (obj instanceof float[]) { 
    arrayHandle((float[]) obj, builder); } else if (obj instanceof short[]) { 
    arrayHandle((short[]) obj, builder); } else if (obj instanceof double[]) { 
    arrayHandle((double[]) obj, builder); } else if (obj instanceof boolean[]) { 
    arrayHandle((boolean[]) obj, builder); } else if (obj instanceof Object[]) { 
    List<Object> list = Arrays.asList((Object[]) obj); for (int i = 0; i < list.size(); i++) { 
    parseObj(list.get(i), builder); if (i < list.size() - 1) { 
    builder.append(","); } } } else { 
    throw new UnsupportedOperationException(obj.getClass().toString()); } builder.append("]"); } else if (String.class.isAssignableFrom(clazz) || Date.class.isAssignableFrom(clazz)) { 
    builder.append("\""); builder.append(obj); builder.append("\""); } else if (Number.class.isAssignableFrom(clazz) || Boolean.class.isAssignableFrom(clazz)) { 
    builder.append(obj); } else { 
    //自定义的实体类 Field[] fields = clazz.getDeclaredFields(); builder.append("{"); for (int i = 0; i < fields.length; i++) { 
    Field field = fields[i]; if (Modifier.isPrivate(field.getModifiers())) { 
    field.setAccessible(true); } builder.append("\""); builder.append(field.getName()); builder.append("\":"); Object value = null; try { 
    value = field.get(obj); } catch (IllegalAccessException e) { 
    e.printStackTrace(); } parseObj(value, builder); if (i < fields.length - 1) { 
    builder.append(","); } } builder.append("}"); } return builder.toString(); } private void arrayHandle(int[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } private void arrayHandle(byte[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } private void arrayHandle(char[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } private void arrayHandle(long[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } private void arrayHandle(float[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } private void arrayHandle(short[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } private void arrayHandle(double[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } private void arrayHandle(boolean[] arr, StringBuilder builder) { 
    for (int i = 0; i < arr.length; i++) { 
    parseObj(arr[i], builder); if (i < arr.length - 1) { 
    builder.append(","); } } } } 

以下为测试代码:

import java.util.*; / * @author qiaoao * @description: * @date 2021/7/30 14:06 */ public class Demo { 
     private long aLong; private int aInt; public short aShort; private static boolean isAlive; private String name; private byte[] bytes; private Date[] dates; private int[][][] superIntArr; private String[][] strings; private List<Map<Integer,String>> list; private Set<int[]> set; private Map<String,List<int[]>> map; public static void main(String[] args) throws IllegalAccessException { 
     Demo demo = Demo.getObj(); String json = JsonUtil.toJsonStr(demo); System.out.println(json); } public static Demo getObj(){ 
     Demo demo = new Demo(); demo.setaLong(L); demo.setaInt(120); Demo.setIsAlive(true); demo.setaShort((short)78); demo.setName("Demo Test"); byte[] bytes = new byte[2]; bytes[0] = 1; bytes[1] = 127; demo.setBytes(bytes); Date[] dates = new Date[3]; dates[1] = new Date(); demo.setDates(dates); int[][][] superIntArr = new int[2][2][2]; for (int i = 0;i<superIntArr.length;i++){ 
     for (int j = 0;j<superIntArr[i].length;j++){ 
     for (int k = 0;k<superIntArr[j].length;k++){ 
     superIntArr[i][j][k] = (int)(Math.random()*100); } } } demo.setSuperIntArr(superIntArr); String[][] strings = new String[5][2]; for (int i = 0; i < strings.length; i++) { 
     for (int j = 0; j < strings[i].length; j++) { 
     strings[i][j] = String.valueOf(Math.random()); } } demo.setStrings(strings); List<Map<Integer,String>> list = new LinkedList<>(); Map<Integer,String> map = new Hashtable<>(); map.put(1,"demo1"); map.put(2,"demo2"); map.put(3,"demo3"); Map<Integer,String> map2 = new Hashtable<>(); map2.put(12,"demo12"); map2.put(22,"demo22"); map2.put(32,"demo32"); list.add(map); list.add(map2); demo.setList(list); Set<int[]> set = new HashSet<>(); for (int i = 0;i<5;i++){ 
     int len = (int)(Math.random()*10)+2; int[] tempArr = new int[len]; for (int j = 0; j < tempArr.length; j++) { 
     tempArr[j] = 100 - j; } set.add(tempArr); } demo.setSet(set); Map<String,List<int[]>> maps = new LinkedHashMap<>(); for (int i = 0;i<=3;i++){ 
     List<int[]> tempList = new Stack<>(); for (int j = 20;j>=0;j--){ 
     int[] hh = new int[5]; for (int k = 0; k < hh.length; k++) { 
     hh[k] = k+j; } tempList.add(hh); } maps.put("list"+i,tempList); } demo.setMap(maps); return demo; } public static void setIsAlive(boolean isAlive) { 
     Demo.isAlive = isAlive; } public void setaLong(long aLong) { 
     this.aLong = aLong; } public void setaInt(int aInt) { 
     this.aInt = aInt; } public void setaShort(short aShort) { 
     this.aShort = aShort; } public void setName(String name) { 
     this.name = name; } public void setBytes(byte[] bytes) { 
     this.bytes = bytes; } public void setDates(Date[] dates) { 
     this.dates = dates; } public void setSuperIntArr(int[][][] superIntArr) { 
     this.superIntArr = superIntArr; } public void setStrings(String[][] strings) { 
     this.strings = strings; } public void setList(List<Map<Integer, String>> list) { 
     this.list = list; } public void setSet(Set<int[]> set) { 
     this.set = set; } public void setMap(Map<String, List<int[]>> map) { 
     this.map = map; } } 

执行结果如下:

{ 
    "aLong":,"aInt":120,"aShort":78,"isAlive":true,"name":"Demo Test","bytes":[1,127],"dates":["null","Fri Jul 30 15:25:35 CST 2021","null"],"superIntArr":[[[11,99],[47,20]],[[20,72],[59,49]]],"strings":[["0.","0."],["0.06673","0.74005"],["0.07729","0.33631"],["0.1504","0.26739"],["0.","0."]],"list":[{ 
    "3":"demo3","2":"demo2","1":"demo1"},{ 
    "32":"demo32","12":"demo12","22":"demo22"}],"set":[[100,99,98],[100,99,98,97,96,95],[100,99,98,97,96,95,94,93,92,91],[100,99,98,97,96,95,94,93],[100,99,98,97,96,95,94,93]],"map":{ 
    "list0":[[20,21,22,23,24],[19,20,21,22,23],[18,19,20,21,22],[17,18,19,20,21],[16,17,18,19,20],[15,16,17,18,19],[14,15,16,17,18],[13,14,15,16,17],[12,13,14,15,16],[11,12,13,14,15],[10,11,12,13,14],[9,10,11,12,13],[8,9,10,11,12],[7,8,9,10,11],[6,7,8,9,10],[5,6,7,8,9],[4,5,6,7,8],[3,4,5,6,7],[2,3,4,5,6],[1,2,3,4,5],[0,1,2,3,4]],"list1":[[20,21,22,23,24],[19,20,21,22,23],[18,19,20,21,22],[17,18,19,20,21],[16,17,18,19,20],[15,16,17,18,19],[14,15,16,17,18],[13,14,15,16,17],[12,13,14,15,16],[11,12,13,14,15],[10,11,12,13,14],[9,10,11,12,13],[8,9,10,11,12],[7,8,9,10,11],[6,7,8,9,10],[5,6,7,8,9],[4,5,6,7,8],[3,4,5,6,7],[2,3,4,5,6],[1,2,3,4,5],[0,1,2,3,4]],"list2":[[20,21,22,23,24],[19,20,21,22,23],[18,19,20,21,22],[17,18,19,20,21],[16,17,18,19,20],[15,16,17,18,19],[14,15,16,17,18],[13,14,15,16,17],[12,13,14,15,16],[11,12,13,14,15],[10,11,12,13,14],[9,10,11,12,13],[8,9,10,11,12],[7,8,9,10,11],[6,7,8,9,10],[5,6,7,8,9],[4,5,6,7,8],[3,4,5,6,7],[2,3,4,5,6],[1,2,3,4,5],[0,1,2,3,4]],"list3":[[20,21,22,23,24],[19,20,21,22,23],[18,19,20,21,22],[17,18,19,20,21],[16,17,18,19,20],[15,16,17,18,19],[14,15,16,17,18],[13,14,15,16,17],[12,13,14,15,16],[11,12,13,14,15],[10,11,12,13,14],[9,10,11,12,13],[8,9,10,11,12],[7,8,9,10,11],[6,7,8,9,10],[5,6,7,8,9],[4,5,6,7,8],[3,4,5,6,7],[2,3,4,5,6],[1,2,3,4,5],[0,1,2,3,4]]}} 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208596.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午11:12
下一篇 2026年3月19日 上午11:13


相关推荐

  • visio2019安装教程

    visio2019安装教程安装前先关闭杀毒软件和 360 卫士 注意安装路径不能有中文 安装包路径也不要有中文 1 选中 Visio2019 压缩包 鼠标右击选择 解压到 Visio2019 2 双击打开 Visio2019 文件夹 3 双击打开 VisioPro2019 镜像文件 4 选中 Setup 可执行文件 鼠标右击选择 以管理员身份运行 5 安装程序准备中 6 安装中 7 鼠标点住 Visio 图标往桌面拖动即可创建桌面快捷方式 8 返回解压文件夹选中 microKMS 可执行文件

    2026年3月19日
    3
  • 独热编码(One-Hot Encoding)介绍及实现

    独热编码(One-Hot Encoding)介绍及实现一、介绍One-Hot编码,又称为一位有效编码,主要是采用位状态寄存器来对个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。独热编码是利用0和1表示一些参数,使用N位状态寄存器来对N个状态进行编码。例如:参考数字手写体识别中:如数字字体识别0~9中,6的独热编码为0000001000自然状态码为:000,001,010,011,100,101…

    2025年8月20日
    5
  • 新东方网课资源分享_新东方笔记大赛官网

    新东方网课资源分享_新东方笔记大赛官网
    新东方李老师的734条高频词组笔记(实在是太有用了!就转来了,没看过的,赶紧点吧~)

    1.abideby(=befaithfulto;obey)忠于;遵守。
    2.beabsentfrom….缺席,不在
    3.absenceofmind(=beingabsent-minded)心不在焉
    4.absorb(=takeuptheattentionof)吸引…的注意力(被动语态)beabsorbedin

    2025年11月5日
    4
  • 院考 c语言知识点完整版

    院考 c语言知识点完整版

    2021年9月27日
    66
  • solt排序整理

    solt排序整理1 对数字的排序 letarr 25 33 3 6 9 7 8 1 2 5 11 18 599 43 从小到大排序 arr arr sort a b gt returna b 从大到小排序 arr arr sort a b gt returnb a 2 对英文字母排序 letarr abc bcd aedc bdcs qsedd sasdf yrdsx arr sort a b gt

    2026年3月18日
    2
  • 《5》CentOS7.0+OpenStack+kvm云平台的部署—组态Horizon[通俗易懂]

    《5》CentOS7.0+OpenStack+kvm云平台的部署—组态Horizon

    2022年1月18日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号