【java/Json】用Java对象构建Json语法树
2024-09-26 04:25:42
本文后续: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
最新文章
- ObjectiveC-MQTT初次接触
- HTML5精美网站模板分享
- centos搭建svn服务器并在windows实验
- 后台子线程(非主线程)更新UI引起的警告
- svg DOM的一些js操作
- jquery zTree 查找所有的叶子节点
- 【分享】4412开发板-嵌入式Linux开发须要掌握的基础知识和技能
- 关于angular的ng-class条件判断
- SQL Server 脚本语句
- WAMP中修改mysql默认空密码
- 面向对象CSS (OOCSS)
- easyui(一) 初始easyui
- SpringMVC实现JSON与前台交互
- [LeetCode] Find Bottom Left Tree Value 寻找最左下树结点的值
- rem 自适应适配方法
- 【翻译】Neural Collaborative Filtering--神经协同过滤
- 前端使用Javascrip实现图片轮播
- spring-boot入门总结
- (网页)javascript如何用递归写一个简单的树形结构
- vue将表格导出为excel