本文后续: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("[ "); /*for(Json json:valueArray) { sb.append(json.toString()+" "); }*/ int n=valueArray.size(); for(int i=0;i<n;i++) { Json json=valueArray.get(i); if(i!=n-1) { sb.append(json.toString()+", "); }else { sb.append(json.toString()+" "); } } sb.append(tabs+"]"); }else if(valueType==Type_List) { sb.append("{ "); Collections.sort(valueList); /*for(Json json:valueList) { sb.append(json.toString()+" "); }*/ int n=valueList.size(); for(int i=0;i<n;i++) { Json json=valueList.get(i); if(i!=n-1) { sb.append(json.toString()+", "); }else { sb.append(json.toString()+" "); } } 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