JAVA根据JSON数据格式生成属性注释

根据JSON数据生成属性注释

需要引入阿里巴巴的fastjson.jar
可以使用hutool-all.jar工具包的StrUtil.isBlank()替换 org.apache.commons.lang.StringUtils.isBlank()

package com.dms.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import org.apache.commons.lang.StringUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dms.common.util.CommonFun;

public class TestFun
{
    public static void main(String[] args)
        throws Exception
    {
        System.out.println("JSON格式化");
        System.out.println("-----------------------------------------------------");
        JSONObject json = getJsonInfo();
        System.out.println(jsonFormat(1, json.toString()));
        List<JSONObject> jsonList = getJsonCommentInfo(json);
        System.out.println("JSON字段注释解析结果");
        System.out.println("-----------------------------------------------------");
        for (JSONObject obj : jsonList)
        {
            System.out.println(obj.getString("key") + ":" + obj.getString("datatype"));
        }
    }
    
    public static JSONObject getJsonInfo()
    {
        JSONObject data = new JSONObject();
        data.put("productname", "注射器");
        JSONArray array = new JSONArray();
        JSONObject linkproduct = new JSONObject();
        linkproduct.put("productnorms", "30mm");
        linkproduct.put("countunit", "只");
        linkproduct.put("pakingcount", "5");
        JSONObject companyproduct = new JSONObject();
        companyproduct.put("supplyprice", "100");
        companyproduct.put("transactioncode", "CN112302");
        linkproduct.put("companyproduct", companyproduct);
        array.add(linkproduct);
        data.put("normsinfo", array);
        JSONObject factory = new JSONObject();
        factory.put("factoryname", "南京xxx厂**有限股份公司");
        factory.put("phonenumber", "12345678910");
        factory.put("manageuser", "张三");
        data.put("factoryinfo", factory);
        JSONArray numbers = new JSONArray();
        numbers.add(541);
        numbers.add(545);
        numbers.add(55);
        numbers.add(4);
        numbers.add(64);
        numbers.add(187);
        numbers.add(64);
        numbers.add(61);
        numbers.add(29);
        data.put("charts", numbers);
        JSONObject json = new JSONObject();
        json.put("msg", "成功");
        json.put("code", 200);
        json.put("data", data);
        return json;
    }
    
    /**
     * 根据JSON对象获取注释格式
     */
    public static List<JSONObject> getJsonCommentInfo(Object json)
        throws Exception
    {
        List<JSONObject> columnInfos = new ArrayList<JSONObject>();
        if (json instanceof com.alibaba.fastjson.JSONObject)
        {
            JSONObject jsonObject = (JSONObject)json;
            for (Map.Entry<String, Object> entry : jsonObject.entrySet())
            {
                String key = entry.getKey();
                JSONObject obj = getJSONObjectForObject(jsonObject, key);
                if (obj == null)
                {
                    String value = entry.getValue().toString();
                    addJsonComment(columnInfos, key, isNumber(value) ? "number" : "varchar");
                    continue;
                }
                //对象格式
                if (obj.getIntValue("objectType") == 1)
                {
                    obj = obj.getJSONObject("value");
                    if (obj.isEmpty())
                    {
                        addJsonComment(columnInfos, key, "varchar");
                        continue;
                    }
                    List<JSONObject> list = getJsonCommentInfo(obj);
                    if (!list.isEmpty())
                        addJsonComment(columnInfos, key + ".", list);
                    else
                        addJsonComment(columnInfos, key, "varchar");
                }
                //数组格式
                else
                {
                    JSONArray array = obj.getJSONArray("value");
                    if (array.isEmpty())
                    {
                        addJsonComment(columnInfos, key, "varchar");
                        continue;
                    }
                    key += "[]";
                    Object aObj = array.get(0);
                    JSONArray jArray = CommonFun.parseJSONArray(aObj.toString());
                    JSONObject jObject = CommonFun.parseJSONObject(aObj.toString());
                    if (jArray.isEmpty() && jObject.isEmpty())
                    {
                        addJsonComment(columnInfos, key, isNumber(aObj.toString()) ? "number" : "varchar");
                        continue;
                    }
                    else if (!jObject.isEmpty())
                    {
                        List<JSONObject> list = getJsonCommentInfo(jObject);
                        if (!list.isEmpty())
                            addJsonComment(columnInfos, key + ".", list);
                        else
                            addJsonComment(columnInfos, key, "varchar");
                        continue;
                    }
                    else if (!jArray.isEmpty())
                    {
                        key += "[]";
                        List<JSONObject> list = getJsonCommentInfo(jArray);
                        if (!list.isEmpty())
                            addJsonComment(columnInfos, key + ".", list);
                        else
                            addJsonComment(columnInfos, key, "varchar");
                    }
                }
            }
        }
        //数组
        else if (json instanceof com.alibaba.fastjson.JSONArray)
        {
            JSONArray array = (JSONArray)json;
            String key = "[]";
            Object aObj = array.get(0);
            JSONArray jArray = CommonFun.parseJSONArray(aObj.toString());
            JSONObject jObject = CommonFun.parseJSONObject(aObj.toString());
            if (jArray.isEmpty() && jObject.isEmpty())
            {
                addJsonComment(columnInfos, key, isNumber(aObj.toString()) ? "number" : "varchar");
            }
            else if (!jObject.isEmpty())
            {
                List<JSONObject> list = getJsonCommentInfo(jObject);
                if (!list.isEmpty())
                    addJsonComment(columnInfos, key + ".", list);
                else
                    addJsonComment(columnInfos, key, "varchar");
            }
            else if (!jArray.isEmpty())
            {
                key += "[]";
                List<JSONObject> list = getJsonCommentInfo(jArray);
                if (!list.isEmpty())
                    addJsonComment(columnInfos, key + ".", list);
                else
                    addJsonComment(columnInfos, key, "varchar");
            }
        }
        else
        {
            throw new Exception("JSON格式不正确");
        }
        return columnInfos;
    }
    
    /**
     * 根据集合批量接收属性注释
     * @Author 朱腾
     * @Time 2021年11月23日
     */
    private static void addJsonComment(List<JSONObject> columnInfos, String key, List<JSONObject> list)
        throws Exception
    {
        for (JSONObject detaiObj : list)
        {
            addJsonComment(columnInfos, key + detaiObj.getString("key"), detaiObj.getString("datatype"));
        }
    }
    
    /**
     * 增加属性注释
     * @Author 朱腾
     * @Time 2021年11月23日
     */
    private static void addJsonComment(List<JSONObject> columnInfos, String key, String datatype)
        throws Exception
    {
        JSONObject columnComment = new JSONObject();
        columnComment.put("key", key);
        columnComment.put("datatype", datatype);
        columnInfos.add(columnComment);
    }
    
    /**
     * 验证字符串是否为数字
     * @Author 朱腾
     * @Time 2021年1月25日
     */
    public static boolean isNumber(String str)
        throws Exception
    {
        if (StringUtils.isBlank(str))
            return false;
        //遍历
        for (int i = 0; i < str.length(); i++)
        {
            char c = str.charAt(i);
            try
            {
                //转为数字,如果转数字的过程中出现了异常,则为非数字
                Short.valueOf(String.valueOf(c));
            }
            catch (Exception e)
            {
                //字符非数字
                return false;
            }
        }
        return true;
    }
    
    /**
     * 根据key值获取JSONObject中的JSON对象
     * @author 朱腾
     * @Time 2020年7月5日
     */
    public static JSONObject getJSONObjectForObject(JSONObject jsonObject, String key)
    {
        JSONObject json = null;
        try
        {
            JSONObject value = jsonObject.getJSONObject(key);
            if (value == null)
                return json;
            json = new JSONObject();
            json.put("value", value);
            //1:JSONObject对象;2:JSONArray数组
            json.put("objectType", 1);
            return json;
        }
        catch (Exception e)
        {
            try
            {
                JSONArray value = jsonObject.getJSONArray(key);
                if (value == null)
                    return json;
                json = new JSONObject();
                json.put("value", value);
                //1:JSONObject对象;2:JSONArray数组
                json.put("objectType", 2);
            }
            catch (Exception e1)
            {
                return json;
            }
        }
        return json;
    }
    
    /**
     * 格式化json数据  退格用\t 换行用\r
     * @param formatType:格式化方式,默认控制台格式【1:控制台;2:HTML;】
     * @param jsonStr:JSON字符串
     * @Author 朱腾
     * @Time 2020年11月14日
     */
    public static String jsonFormat(Integer formatType, String jsonStr)
    {
        //去除特殊字符
        jsonStr = Optional.ofNullable(jsonStr).orElse("").replace("\n", "").replace("\t", "");
        String breakLine = "\n";
        String space = "\t";
        if (formatType != null && formatType == 2)
        {
            breakLine = "<br>";
            space = "&nbsp;&nbsp;";
        }
        int level = 0;
        StringBuffer jsonForMatStr = new StringBuffer();
        for (int i = 0; i < jsonStr.length(); i++)
        {
            char c = jsonStr.charAt(i);
            if (level > 0 && breakLine.equals(
                jsonForMatStr.substring((jsonForMatStr.length() - breakLine.length()), (jsonForMatStr.length() - 1))))
            {
                jsonForMatStr.append(getLevelStr(space, level));
            }
            switch (c)
            {
                case '{':
                case '[':
                    jsonForMatStr.append(c + breakLine);
                    jsonForMatStr.append(getLevelStr(space, ++level));
                    break;
                case ',':
                    jsonForMatStr.append(c + breakLine);
                    jsonForMatStr.append(getLevelStr(space, level));
                    break;
                case '}':
                case ']':
                    jsonForMatStr.append(breakLine);
                    level--;
                    jsonForMatStr.append(getLevelStr(space, level));
                    jsonForMatStr.append(c);
                    break;
                default:
                    jsonForMatStr.append(c);
                    break;
            }
        }
        return jsonForMatStr.toString();
    }
    
    /**
     * JSON格式化,内部调用
     * @Author 朱腾
     * @Time 2020年11月14日
     */
    private static String getLevelStr(String space, int level)
    {
        StringBuffer levelStr = new StringBuffer();
        for (int levelI = 0; levelI < level; levelI++)
        {
            levelStr.append(space);
        }
        return levelStr.toString();
    }
}

执行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。在 JSON 中,数据以键值对的形式存在,并使用逗号分隔。 JSON 的基本语法规则如下: - 数据在键值对中,用逗号分隔。 - 大括号 {} 包含对象,对象以键值对的形式存在,键值对之间用逗号分隔。 - 方括号 [] 包含数组,数组中的元素之间用逗号分隔。 下面是一个简单的 JSON 示例: ``` { "name":"John", "age":30, "city":"New York" } ``` 在这个 JSON 中,有三个键值对,分别是 name、age 和 city,它们的值分别为 "John"、30 和 "New York"。 如果要表示一个数组,可以使用以下形式: ``` { "fruits": [ "apple", "banana", "orange" ] } ``` 在这个 JSON 中,fruits 是一个数组,包含了三个元素:apple、banana 和 orange。 需要注意的是,JSON 中的键名必须用双引号引起来,而值可以是字符串、数字、布尔值、数组、对象或 null。 ### 回答2: JSONJavaScript Object Notation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。 首先,JSON数据由键值对组成。每个键值对通过冒号分隔,键值对之间用逗号分隔。键是一个字符串,值可以是字符串、数值、布尔值、数组、对象或null。 JSON的数据类型有: - 字符串:使用双引号包裹的文本,例如:"name": "张三"。 - 数值:整数或浮点数,例如:"age": 18。 - 布尔值:true或false,例如:"isStudent": true。 - 数组:由方括号包裹的一组值,值之间用逗号分隔,例如:"hobbies": ["篮球", "音乐", "旅行"]。 - 对象:由花括号包裹的一组键值对,键值对之间用逗号分隔,例如:"address": {"city": "北京", "province": "北京市"}。 - null:表示为空值,例如:"phone": null。 在使用JSON时,需要遵循以下规则: 1. 键名必须是字符串,需要使用双引号括起来。 2. 字符串必须使用双引号括起来,不能使用单引号。 3. 数组或对象的末尾不能有多余的逗号。 4. JSON本身不支持注释。 使用JSON可以实现数据的序列化和反序列化。序列化是将数据转换为JSON格式,反序列化是将JSON格式的数据转换回原始数据类型。 常见的操作JSON的方法有: - 在前端,可以使用JSON.stringify()将JavaScript对象转换为JSON字符串,使用JSON.parse()将JSON字符串转换为JavaScript对象。 - 在后端,可以使用各种编程语言的JSON库或框架,如Python的json模块、Java的Gson库等,在对象和JSON格式之间进行转换。 总而言之,JSON格式的数据具有易读、易解析、易支持多种编程语言等特点,被广泛应用于网络数据传输和存储。 ### 回答3: JSONJavaScript Object Notation)是一种数据交换格式,常被用于前后端数据传输和存储。以下是关于JSON格式数据的一些介绍。 JSON数据以键值对的形式存储,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象等。一个简单的JSON数据如下: { "name": "张三", "age": 25, "isStudent": true } 在JSON数据中,使用大括号 {} 表示对象,每个键值对之间使用逗号 , 分隔。键值对由冒号 : 分隔,键的名称要双引号。 对于数组类型的值,使用中括号 [] 表示,多个值之间用逗号 , 分隔。数组中可以包含各种类型的数据,例如: { "name": "张三", "hobbies": ["篮球", "游泳", "旅行"] } JSON数据可以通过编码和解码实现不同编程语言之间的数据转换。在编码过程中,将数据转换为JSON格式的字符串,比如使用JSON.stringify()函数。而在解码过程中,将JSON格式的字符串转换成特定编程语言中的数据结构,比如使用JSON.parse()函数。 通过JSON格式的数据,前后端可以方便地传输和解析数据,实现数据的跨平台和跨语言的交互。JSON具有可读性好、易于理解和扩展的特点,在现代的Web开发中被广泛使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TorZhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值