【java/Json】用Java对象构建Json语法树
本文后续: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语法树的更多相关文章
- [Java]手动构建SQL语法树(sql简单无嵌套)并输出与之对应的SQL语句之二
Entry入口 main中自顶向下手动创建了sql语法树 package com.hy; // 构建SQL语法树 public class Entry { public static void mai ...
- 【JSON 注解】JSON循环引用2----JSON注解@JsonIgnoreProperties+JAVA关键字transient+后台对象与JSON数据的格式互相转化
接着来说这个JSON循环引用的问题: 关于JSON格式的转化,其实关键就是这几个依赖: <!-- json --> <!-- 1号 --> <dependency> ...
- java基础之泛型对象与json互转
1. 场景描述 把泛型对象转成字符串放到缓存中,获取后使用有点问题,记录下,有碰到的朋友,参考下. 2. 解决方案 2.1 操作类及说明 /** * @auther: 软件老王 */ public s ...
- 【转】java注解处理器——在编译期修改语法树
https://blog.csdn.net/a_zhenzhen/article/details/86065063 前言从需求说起由于相关政策,最近公司安全部要求各系统在rpc接口调用的交互过程中把相 ...
- java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- java中Map等对象转换为json
ObjectMapper objectMapper = new ObjectMapper(); String jsonString = objectMapper.writeValueAsString( ...
- 利用jsonconvert来转换json数据格式 (对象转为json)
今天学了一下.net的WCF组件,边心血来潮,想着现在不都是前后分离,调接口开发不,于是赶紧写了一简单的后台数据,哈哈 废话不多说,直接上代码: 注意需要导入库! 实体类:Customer us ...
- JSON字符串和对象之间的转换
JSON(JavaScript Object Notation) 是JavaScript编程语言的一个子集.正因JSON是JavaScript的一个子集,所以它可清晰的运用于此语言中. eval函数 ...
- JSON 与 JS 对象的区别与对比
定义: JSON是什么?JSON是JS的一种简单数据格式,JSON是JavaScript原生格式,它是一种严格的js对象的格式,JSON的属性名必须有双引号,如果值是字符串,也必须是双引号. 问题: ...
随机推荐
- springboot2.1.3使用jdbcTemplate
这里只是备忘一下使用方式,至于配置数据源信息不在此文中讲解,忘谅解. 1. 查询返回List<Long>数据集 (这里比如返回userId,long型) @Autowired@Quali ...
- 分布式结构化存储系统-HBase基本架构
分布式结构化存储系统-HBase基本架构 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在大数据领域中,除了直接以文件形式保存数据外,还有大量结构化和半结构化的数据,这类数据通常需 ...
- WSDL知识点
WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言. WSDL简介 1.什么是 WSDL? WSDL 指网络服务描述语言 WSDL 使用 X ...
- egg.js 完整实例2后台管理系统
项目地址 github.com/richard1015… 技术栈 Vue.js.iview.websocket.Amap 演示地址: 后台管理 schoolmgr.zhuzhida.vip 前台展示 ...
- Lenet5设计理解——咬文嚼字系列
最近在看lecun大神的这篇经典文章:“Gradient-Based Learning Appliedto Document Recognition”,文章较老,但是对于lenet5的一些基础概念讲解 ...
- spring常用的事务传播属性说明
事务Transaction,就是一组操作数据库的动作集合.事务是现代数据库理论中的核心概念之一.如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务.当所有的步骤像一个操作一样被 ...
- linux上如何删除文件名乱码的文件
这里写图片描述今天在服务上发现了两个文件名是乱码的文件,如图所示.这里写图片描述于是想用rm命令把它们删掉,但提示没有此文件. 网上搜了一下,找到解决方法,首先执行ls -i命令,此时在文件前面会出现 ...
- hdu6715 算术 2019百度之星初赛3-1003
题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=6715 题解 还是不会这题的容斥做法qwq.hjw当场写了个容斥A了.我推了个莫反,但是没反应过来我的式 ...
- 超全整理!Linux shell及常用36类命令汇总
本文采编自http://blog.csdn.net,作者为ZHXGXN,版权归作者所有! 使用Linux shell是一些程序员每天的基本工作,但我们经常会忘记一些有用的shell命令和技巧.当然,命 ...
- machine learning (7)---normal equation相对于gradient descent而言求解linear regression问题的另一种方式
Normal equation: 一种用来linear regression问题的求解Θ的方法,另一种可以是gradient descent 仅适用于linear regression问题的求解,对其 ...