【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的属性名必须有双引号,如果值是字符串,也必须是双引号. 问题: ...
随机推荐
- [bluez] linux下蓝牙鼠标的延迟问题
引言 现在的便携设备,接口越来越少了.所以我们没有理由不用蓝牙鼠标.高大上也不贵. 蓝牙4.0之前,蓝牙设备的问题是特别费电.蓝牙4.0之后省电的要命,我的上一个鼠标Microsoft Designe ...
- 修改bash终端命令行颜色
要修改linux终端命令行颜色,我们需要用到PS1,PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置.在终端输入命令:#set,即可在输出中找到关于PS1的定义如下: PS1='[ ...
- 华为云和开源Istio运维管理对比样例应用部署
前言 在公有云方面,华为云已经率先将 Istio 作为产品投入到公有云中进行商业应用中,保持和开源istio高度兼容,做了商业化的运维管理界面,同时进行了性能优化.这里我们做一次验证测试. Booki ...
- SQL进阶系列之0窗口函数
窗口函数 What's 窗口函数? 窗口函数也称为OLAP(OnLine Analytical Processing)函数,目前MySQL还不支持. 窗口函数的语法 <窗口函数> OVER ...
- python中的exec和eval
exec 描述 exec 执行储存在字符串或文件中的 Python 语句,相比于 eval,exec可以执行更复杂的 Python 代码. 返回值 exec 返回值永远为 None. 需要说明的是在 ...
- linux的virtualenv和virtualenvwarpper
转自:https://www.cnblogs.com/qq631243523/p/10191748.html 一,介绍 在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的 ...
- BOM常用属性与方法
BOMBrowser Object Modelwindow浏览器窗口window方法locationlocation常用属性screen显示器屏幕screen常用属性navigator浏览器软件nav ...
- 【转】Http和Https下的cookie的写入问题
网站https:// 可以登陆, 但是切换到http的时候不能登陆. 原因是:https访问的时候,返回的cookie设置了secure=1, 切换成http访问的时候, 这个时候不能操作那个cook ...
- vue 中数据共享的方式
1.父子组件的数据传递2.store模式 - 局部的数据共享3.vuex 中共享 state - 全局的数据共享
- 原创!ngxtop-监控nginx的利器!!!
原创!ngxtop-监控nginx的利器!!! 无论名称还是界面,ngxtop的灵感均源自大名鼎鼎的top命令.ngxtop的功能就是,分析Nginx访问日志文件(以及其他日志文件,比如Apache2 ...