【json/regex】将简单对象生成的json文进行内部排序后再输出

有这样一个实体类:

复制代码
package com.hy;

public class Emp {
    private int id;
    private int age;
    private String name;
    private boolean isMale;

    private String phone;
    
    public Emp() {
        
    }
    
    public Emp(int id,int age,String name,boolean isMale,String phone) {
        this.id=id;
        this.age=age;
        this.name=name;
        this.isMale=isMale;
        this.phone=phone;
    }
    
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isMale() {
        return isMale;
    }

    public void setMale(boolean isMale) {
        this.isMale = isMale;
    }
}
复制代码

如果有这样一个实例:

Emp felix=new Emp(6,47,"费力克死",false,"18000000001");

那用这个实例得到json文是:

{"age":47,"id":6,"male":false,"name":"费力克死","phone":"18000000001"}

这个结果没有以key排序且是横向扩展的,如果属性众多可读性就不是那么理想。

因此,下面这个类就登场了:

复制代码
package com.hy;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import net.sf.json.JSONObject;

/**
 * 简单Json排序类
 * @author 逆火
 *
 * 2019年11月24日 上午11:57:39
 */
public class SimpleJsonSorter {
    private List<KeyValue> kvList;
    
    public SimpleJsonSorter(String jsonStr){
        kvList=new ArrayList<KeyValue>();
        
        java.util.regex.Pattern pattern=Pattern.compile("(\"([_a-zA-Z]+[_a-zA-Z0-9]*)\")[:]([^,}]+)");
        Matcher matcher=pattern.matcher(jsonStr);
        while(matcher.find()) {
            //System.out.println( matcher.group(1)+ ":"+matcher.group(3));
            kvList.add(new KeyValue(matcher.group(1),matcher.group(3)));
        }
    }
    
    public String getFormattedJson() {
        Collections.sort(kvList);
        
        StringBuilder sb=new StringBuilder();
        
        sb.append("{\n");
        
        for(KeyValue kv:kvList) {
            sb.append("\t"+kv.key+":"+kv.value+",\n");
        }
        
        sb.append("}");
        
        return sb.toString();
    }
    
    protected final class KeyValue implements Comparable<KeyValue>{
        private String key;
        private String value;
        
        public KeyValue(String key,String value) {
            this.key=key;
            this.value=value;
        }
        
        public int compareTo(KeyValue other) {
            return this.key.compareTo(other.key);
        }
    }
    
    public static void main(String[] args) {
        Emp felix=new Emp(6,47,"费力克死",false,"18000000001");
        
        JSONObject deptJson = JSONObject.fromObject(felix);
        String jsonString=deptJson.toString();
        System.out.println(jsonString);
        
        SimpleJsonSorter sjs=new SimpleJsonSorter(jsonString);
        System.out.println(sjs.getFormattedJson());
    }
}
复制代码

经过它整形后,json文会是:

{
    "age":47,
    "id":6,
    "male":false,
    "name":"费力克死",
    "phone":"18000000001",
}

这样,它内部key以字母序排列,方便查找,又是竖向扩展的,用于写文档省力多了。

--END-- 2019年11月24日12:27:34

posted @   逆火狂飙  阅读(229)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示