本文后续:https://www.cnblogs.com/xiandedanteng/p/11973129.html

编译第一步:将文本解析成Java对象构成的语法树

第二步:将语法树输出整形好的Json新文本。

下面完成的是第二步:

package com.hy;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

import org.apache.log4j.Logger;

public class Json implements Comparable<Json>{
    private static Logger log = Logger.getLogger(Json.class);

    // There are value types
    private int Type_String=1;
    private int Type_Array=2;
    private int Type_List=3;

    // Key always is String
    private String key;

    // There are three types of value
    private int valueType;
    private String valueString;
    private List<Json> valueArray;// 本质一致,表现不同
    private List<Json> valueList;

    // indent depth
    private int depth;

    /**
     * Contructor1
     */
    public Json(String key,String value) {
        this.key=key;
        this.valueType=Type_String;
        this.valueString=value;
        this.depth=0;
    }

    public Json(String key,int type) {
        this.key=key;

        if(type==Type_List) {
            this.valueType=Type_List;
            this.valueList=new LinkedList<Json>();
        }else if(type==Type_Array) {
            this.valueType=Type_Array;
            this.valueArray=new LinkedList<Json>();
        }
    }

    public void addJsonToList(Json json) {
        if(valueList!=null) {
            valueList.add(json);

            adjustDepth();
        }
    }

    public void addJsonToArray(Json json) {
        if(valueArray!=null) {
            valueArray.add(json);

            adjustDepth();
        }
    }

    private void adjustDepth() {
        if(valueType==Type_List) {
            for(Json json:valueList) {
                json.depth=this.depth+1;
                json.adjustDepth();
            }

        }

        if(valueType==Type_Array) {
            for(Json json:valueArray) {
                json.depth=this.depth+1;
                json.adjustDepth();
            }
        }
    }

    public String toString() {
        StringBuilder sb=new StringBuilder();

        // key
        String tabs=getIndentSpace();
        sb.append(tabs);
        //sb.append("\""+(key==null?"":key)+"\"");

        if(key!=null) {
            sb.append("\""+key+"\"");
            sb.append(":");
        }else {

        }

        // value
        if(valueType==Type_String) {
            sb.append("\""+valueString+"\"");
        }else if(valueType==Type_Array) {
            sb.append("[\n");

            /*for(Json json:valueArray) {
                sb.append(json.toString()+"\n");
            }*/

            int n=valueArray.size();
            for(int i=0;i<n;i++) {
                Json json=valueArray.get(i);
                if(i!=n-1) {
                    sb.append(json.toString()+",\n");
                }else {
                    sb.append(json.toString()+"\n");
                }
            }

            sb.append(tabs+"]");
        }else if(valueType==Type_List) {
            sb.append("{\n");

            Collections.sort(valueList);

            /*for(Json json:valueList) {
                sb.append(json.toString()+"\n");
            }*/

            int n=valueList.size();
            for(int i=0;i<n;i++) {
                Json json=valueList.get(i);
                if(i!=n-1) {
                    sb.append(json.toString()+",\n");
                }else {
                    sb.append(json.toString()+"\n");
                }
            }

            sb.append(tabs+"}");
        }

        //sb.append(",");

        return sb.toString();
    }

    public int compareTo(Json other) {
        return this.key.compareTo(other.key);
    }

    private String getIndentSpace() {
        return String.join("", Collections.nCopies(this.depth, "    "));
    }

    public static void main(String[] args) {
        Json id1=new Json("id","001");
        Json name1=new Json("name","白菜");

        Json title=new Json("title",3);
        title.addJsonToList(id1);
        title.addJsonToList(name1);

        Json empty1=new Json(null,3);
        empty1.addJsonToList(new Json("id","001"));
        empty1.addJsonToList(new Json("id","你好白菜"));

        Json empty2=new Json(null,3);
        empty2.addJsonToList(new Json("id","001"));
        empty2.addJsonToList(new Json("id","你好萝卜"));

        Json content=new Json("content",2);
        content.addJsonToArray(empty1);
        content.addJsonToArray(empty2);

        Json data=new Json("data",3);
        data.addJsonToList(title);
        data.addJsonToList(content);

        Json status=new Json("status","0000");
        Json message=new Json("message","success");

        Json root=new Json(null,3);
        root.addJsonToList(status);
        root.addJsonToList(message);
        root.addJsonToList(data);

        System.out.println(root.toString());
    }
}

输出:

{
    "data":{
        "content":[
            {
                "id":"001",
                "value":"你好白菜"
            },
            {
                "id":"002",
                "value":"你好萝卜"
            }
        ],
        "title":{
            "id":"001",
            "name":"白菜"
        }
    },
    "message":"success",
    "status":"0000"
}

可以看到,子对象都是按字母序排列的,这也是制作此类的最终目的之一。

--END-- 2019年12月1日11:26:39

【java/Json】用Java对象构建Json语法树的更多相关文章

  1. [Java]手动构建SQL语法树(sql简单无嵌套)并输出与之对应的SQL语句之二

    Entry入口 main中自顶向下手动创建了sql语法树 package com.hy; // 构建SQL语法树 public class Entry { public static void mai ...

  2. 【JSON 注解】JSON循环引用2----JSON注解@JsonIgnoreProperties+JAVA关键字transient+后台对象与JSON数据的格式互相转化

    接着来说这个JSON循环引用的问题: 关于JSON格式的转化,其实关键就是这几个依赖: <!-- json --> <!-- 1号 --> <dependency> ...

  3. java基础之泛型对象与json互转

    1. 场景描述 把泛型对象转成字符串放到缓存中,获取后使用有点问题,记录下,有碰到的朋友,参考下. 2. 解决方案 2.1 操作类及说明 /** * @auther: 软件老王 */ public s ...

  4. 【转】java注解处理器——在编译期修改语法树

    https://blog.csdn.net/a_zhenzhen/article/details/86065063 前言从需求说起由于相关政策,最近公司安全部要求各系统在rpc接口调用的交互过程中把相 ...

  5. java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...

    @RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...

  6. java中Map等对象转换为json

    ObjectMapper objectMapper = new ObjectMapper(); String jsonString = objectMapper.writeValueAsString( ...

  7. 利用jsonconvert来转换json数据格式 (对象转为json)

      今天学了一下.net的WCF组件,边心血来潮,想着现在不都是前后分离,调接口开发不,于是赶紧写了一简单的后台数据,哈哈  废话不多说,直接上代码: 注意需要导入库! 实体类:Customer us ...

  8. JSON字符串和对象之间的转换

    JSON(JavaScript Object Notation) 是JavaScript编程语言的一个子集.正因JSON是JavaScript的一个子集,所以它可清晰的运用于此语言中. eval函数 ...

  9. JSON 与 JS 对象的区别与对比

    定义: JSON是什么?JSON是JS的一种简单数据格式,JSON是JavaScript原生格式,它是一种严格的js对象的格式,JSON的属性名必须有双引号,如果值是字符串,也必须是双引号. 问题: ...

随机推荐

  1. mysql遇到时区问题的坑(Java解决方案)

    最近项目遇到一个坑,就是server和db之间存在时区问题,本人的db是utc时间, 可以使用代码设置时区来解决,本人这里使用joda三方包,joda蛮好用的,具体用法这里不做详细描述. 先引入pom ...

  2. 探索JVM底层奥秘ClassLoader源码分析

    1.JVM基本结构: *.java--------javac编译------>*.class-----ClassLoad加载---->运行时数据区------->执行引擎,接口库-- ...

  3. 网站检测空链、死链工具(Xenu)

    网站常用检测空链.死链工具,Xenu是很小但是功能强大的检查网站404链接的软件,支持多线程,无需安装可直接打开使用.步骤如下: 网站的链接一般都成千上万,如果存在大量的空链接将大大的影响用户体验,怎 ...

  4. head meta属性整理笔记

    最近做这个站点http://zhimo.yuanzhumuban.cc/,百度一直出现转码问题,很头疼,通过一周时间研究meta属性,达到了代码优化的效果,在此做一些笔记. <head> ...

  5. POJ3709 K-Anonymous Sequence

    题意 Language:Default K-Anonymous Sequence Time Limit: 4000MS Memory Limit: 65536K Total Submissions: ...

  6. Machine learning system design---Error analysis

    Error analysis--让我们系统的去判断我们接下来要做什么,而不是随机的,凭直觉地选择一个去做 我们在设计机器学习应用时,刚开始使用简单(简单的features)的算法来很快的完成它,它可能 ...

  7. python的种类有哪些?

    CPython 当我们从Python官方网站下载并安装好Python 3.6后,我们就直接获得了一个官方版本的解释器:CPython.这个解释器是用C语言开发的,所以叫CPython.在命令行下运行p ...

  8. neo4j安装部署

    链接: https://blog.csdn.net/u013946356/article/details/81736232

  9. MySQL 是怎么保证数据一致性的(转载)

    在<写数据库同时发mq消息事务一致性的一种解决方案>一文的方案中把分布式事务巧妙转成了数据库事务.我们都知道关系型数据库事务能保证数据一致性,那数据库到底是怎么设计事务这一特性的呢? 一. ...

  10. MySQL Create table as / Create table like

    a.create table like方式会完整地克隆表结构,但不会插入数据,需要单独使用insert into或load data方式加载数据 b.create table as  方式会部分克隆表 ...