Java-Json的格式化和转参数表格

Posted 十木禾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-Json的格式化和转参数表格相关的知识,希望对你有一定的参考价值。

首先感谢 ShowDoc 这个网站提供的帮助,然后里面有两个功能Json的格式化和转参数表格,在这里我使用Java代码来实现,以便于我们使用相应的开放接口功能。


Json美化代码本人参考网上代码,Json转参数表格代码全部由本人完成开发。

首先需要下载 fastjson-1.1.41.jar 并导入到项目中去。

封装后的工具类代码如下(可直接复制使用):

package com.test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.TypeReference;
import org.apache.http.util.TextUtils;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Stack;

/**
 * Created by 张俊强~ on 2017/10/17.
 */
public class JSONUtils 

    private static String SPACE = "   ";

    private static Stack<String> tableStack = new Stack<String>();
    private static Integer tableLevel = 0;                            //标志当前table的层级

    public final static int JSON_TYPE_OBJECT=1;
    public final static int JSON_TYPE_ARRAY=2;
    public final static int JSON_TYPE_ERROR=3;

    /**
     * 返回格式化JSON字符串.
     *
     * @param json 未格式化的JSON字符串.
     * @return 格式化的JSON字符串 .
     */
    public static String formatJson(String json) 
        StringBuffer result = new StringBuffer();

        int length = json.length();
        int number = 0;
        char key = 0;
        //遍历输入字符串。
        for (int i = 0; i < length; i++) 
            //1、获取当前字符。
            key = json.charAt(i);
            //2、如果当前字符是前方括号、前花括号做如下处理:
            if ((key == '[') || (key == '')) 
                //(1)打印:当前字符。
                result.append(key);
                //(2)前方括号、前花括号,的后面必须换行。打印:换行。
                result.append('\\n');
                //(3)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。
                number++;
                result.append(indent(number));
                //(4)进行下一次循环。
                continue;
            

            //3、如果当前字符是后方括号、后花括号做如下处理:
            if ((key == ']') || (key == '')) 
                //(1)后方括号、后花括号,的前面必须换行。打印:换行。
                result.append('\\n');
                //(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。
                number--;
                result.append(indent(number));
                //(3)打印:当前字符。
                result.append(key);
                //(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。
                if (((i + 1) < length) && (json.charAt(i + 1) != ',')) 
                    result.append('\\n');
                
                //(5)继续下一次循环。
                continue;
            

            //4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。
            if ((key == ',')) 
                result.append(key);
                result.append('\\n');
                result.append(indent(number));
                continue;
            
            //5、打印:当前字符。
            result.append(key);
        
        return result.toString();
    

    /**
     * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE.
     *
     * @param number 缩进次数.
     * @return 指定缩进次数的字符串.
     */
    private static String indent(int number) 
        StringBuffer result = new StringBuffer();
        for (int i = 0; i < number; i++) 
            result.append(SPACE);
        
        return result.toString();
    

    /**
     * 将json转参数表格.
     *
     * @param json 未格式化的JSON字符串.
     * @return the string
     */
    public static String formatJsonToTable(String json) 
        tableLevel++;
        String result = "";

        LinkedHashMap<String, String> jsonMap = JSON.parseObject(json, new TypeReference<LinkedHashMap<String, String>>() 
        );

        for (Map.Entry<String, String> entry : jsonMap.entrySet()) 

            tableStack.add("|" + entry.getKey() + "|    string   |    是   |    无   |\\n");

            switch (getJSONType(entry.getValue())) 
                case JSONUtils.JSON_TYPE_ARRAY:
                    JSONArray jsonArray = JSON.parseArray(entry.getValue().toString());
                    if (jsonArray.size() > 0) 
                        tableStack.pop();
                        String listPre = "";
                        for (int i = 0; i < tableLevel; i++) 
                            listPre += " -";
                        
                        tableStack.add("|" + listPre + " " + entry.getKey() + "|    object   |    是   |    无   |\\n");
                        for (int i = 0; i < jsonArray.size(); i++) 
                            formatJsonToTable(jsonArray.get(i).toString());
                        
                    
                    break;
                case JSONUtils.JSON_TYPE_OBJECT:
                    formatJsonToTable(entry.getValue());
                    break;
                case JSONUtils.JSON_TYPE_ERROR:
                    break;
                default:
                    break;
            
        
        tableLevel--;
        if (tableLevel == 0) 
            for (int i = 0; i < tableStack.size(); i++) 
                result += tableStack.get(i);
            
        

        return result;
    

    public static int getJSONType(String str) 
        if (TextUtils.isEmpty(str)) 
            return JSONUtils.JSON_TYPE_ERROR;
        

        final char[] strChar = str.substring(0, 1).toCharArray();
        final char firstChar = strChar[0];


        if (firstChar == '') 
            return JSONUtils.JSON_TYPE_OBJECT;
         else if (firstChar == '[') 
            return JSONUtils.JSON_TYPE_ARRAY;
         else 
            return JSONUtils.JSON_TYPE_ERROR;
        
    


如下未格式化的Json为例:

"fields":["field":"task_number","op":"like","value":"20"],"page":1,"size":10

格式化之后如下:


   "fields":[
      
         "field":"task_number",
         "op":"like",
         "value":"20"
      

   ],
   "page":1,
   "size":10

转参数表格之后如下:

| - fields|    object   |    是   |    无   |
|field|    string   |    是   |    无   |
|op|    string   |    是   |    无   |
|value|    string   |    是   |    无   |
|page|    string   |    是   |    无   |
|size|    string   |    是   |    无   |

在参数表格上加上头信息,即是md格式,可解析如下:

参数名类型必选说明
  • fields
object
fieldstring
opstring
valuestring
pagestring
sizestring

以上即相关内容。

以上是关于Java-Json的格式化和转参数表格的主要内容,如果未能解决你的问题,请参考以下文章

Java-json

Java-json

如何同时使用 QUERY 和 IMPORTRANGE 函数来提取和转置谷歌表格中的数据?

使用 Power Query 对数据进行分组和转置

Json字符串转对象和转List集合操作(json-lib版本)

VBA复制粘贴到新工作表,If语句和转置