JsonBuilder初出茅庐
互联网这股东风不久前刮到了甘凉国,国王老甘独具慧眼,想赶紧趁着东风未停大力发展移动互联网,因为他笃信布斯雷的理论:“站在风口上,猪都能飞起来”。无奈地方偏僻落后,国内无可用之才啊。老甘一筹莫展的低头凝思应声被打断,“启奏陛下,有四个从东土大唐来的和尚前来更换通关文牒”,听到“东土大唐”四个字,老甘心头一喜,答道:“请他们去正堂等候”。
唐僧:贫僧唐三藏,自东土大唐而来,前往西天拜佛求经,今途径贵国,恳请陛下更换通关文牒。
国王:高僧从东方而来,想必对互联网略知一二。
唐僧:贫僧也是略有耳闻,不过我的徒儿对此颇有研究。
国王:寡人现有一需求,还请高僧帮忙处理一下,事成之后,定放你们西行。需求文档一会发你。
唐僧:遵命,谢陛下。
国王:(发文档),@三藏。
唐僧:收到。
唐僧:@悟净,处理下文档中的需求。
沙僧:收到。
对接接口繁琐复杂,还要多方联调。悟空虽然水平高,但是脾气不好,怕打起来;八戒好吃懒惰,恐难当此任;悟净,为师只有辛苦你了。唐僧心里想到此,不由得叹气一声。
沙僧:师傅,这文档写的乱七八糟、语句不通,很多入参、出参模糊不清,对方测试环境时好时坏,给他们打电话,他们说很忙暂时没时间管我。
唐僧:悟净,这些为师都知道。程序员都没什么文化,注释、文档总是写不好;而且非常苦逼,总是熬夜加班,所以没有时间。你应该理解以下。
沙僧:哎。。。入参报文格式为json,且非常复杂,我拼了一上午报文,每次都返回入参报文格式不正确。
唐僧:你是怎么拼json格式的报文呢?
沙僧:传统方法啊,先用Map和List组合好,再转成json字符串。
唐僧:如果json非常复杂的话,要定义好多Map和List,光起些好点儿的名字就够头大的,还要再互相嵌套起来,稍有不慎,很容易出错。真是够够的了。而且要写很多代码。
沙僧:谁说不是呢,师傅有什么好方法吗?
唐僧:json结构你应该很熟悉,它是一个自我嵌套的递归结构。那我们就来设计一个构建器来直接构建json字符串,就叫JsonBuilder吧。
沙僧:我突然想起StringBuilder,它的流式api非常好用,快捷方便。只是字符串是一维的,只有先后顺序,但json是二维的,既有先后顺序,还有内外顺序。
唐僧:你说的内外顺序其实就是父子关系,这也很好处理。
1)只需维护一个指向当前级别的指针,如果只是添加简单的key-value,当前级别保持不变。
2)如果添加了复合value(子节点),当前指针指向新添加的级别(深入一级),此时该级别就成了新的当前级别。
3)当前级别结束后只需回到父级别(退出一级),此时父级别就又成了新的当前级别,如此往复下去即可。
沙僧:师傅,恕徒儿愚钝,您讲的太抽象了,能不能举个例子。
唐僧:看下面的json,
{
"string":"编程新说",
"int":33,
"boolean":true,
"double":3.14,
"null":null,
"sub1":{
"string":"编程新说",
"int":33,
"boolean":true,
"double":3.14,
"null":null
},
"sub2":[
{
"string":"编程新说",
"int":33,
"boolean":true,
"double":3.14,
"null":null
},
{
"string":"编程新说",
"int":33,
"boolean":true,
"double":3.14,
"null":null
}
],
"sub3":[
"编程新说",
33,
true,
3.14,
null
]
}
1)首先指针指向最外层级别,此时添加5个简单的key-value,整个添加过程级别保持不变,即这5个值都添加给了当前级别。
2)然后添加sub1节点,它是一个复合节点,所以当前指针指向新添加的节点级别,此时添加5个简单的key-value,都添加给了sub1,结束后指针回退到上一级。
3)此时再添加sub2,当前指针指向sub2,因sub2是一个数组,也是复合节点。
4)数组里包含的又是复合节点,只不过没有名字而已。添加一个无名字节点,当前指针指向该节点,此时可以为它添加5个key-value,然后回到上一级,即数组级别
5)然后添加第二个无名字节点,为它添加5个key-value,回到上一级,再回到上一级。
6)然后添加sub3,因为它的value都是简单值,所以添加value时当前级别不变,停留在数组级别。完成之后回到上一级,即最外层级别。
沙僧:这么一讲解倒是非常直观,层次也很清晰,所见即所得。还是师傅厉害。
唐僧:为师也没那么厉害了,只是趁着你们打妖怪的时候,多琢磨了一会儿。说起来简单,实现起来还是有些许难度的,要不你来试试。可以参考这个示例。
JsonBuilder jb = new JsonBuilder();
jb.kv("string", "编程新说")
.kv("int", 33)
.kv("boolean", true)
.kv("double", 3.14)
.kv("null", null)
.ko("sub1")
.kv("string", "编程新说")
.kv("int", 33)
.kv("boolean", true)
.kv("double", 3.14)
.kv("null", null)
.end()
.ka("sub2")
.io()
.kv("string", "编程新说")
.kv("int", 33)
.kv("boolean", true)
.kv("double", 3.14)
.kv("null", null)
.end()
.io()
.kv("string", "编程新说")
.kv("int", 33)
.kv("boolean", true)
.kv("double", 3.14)
.kv("null", null)
.end()
.end()
.ka("sub3")
.iv("编程新说")
.iv(33)
.iv(true)
.iv(3.14)
.iv(null)
.end();
沙僧:好的,只是这变量名字有点。。。但别光我一人啊,也让广大群众试试吧。
悟净得到师傅的指点后,有一点小小的豁然开朗,决定自己去实现一把。但想到又开始去对接口,不由得叹气一声,哎。。。
PS:也可以按照此方法写一个MapBuilder。
PS:也可以按照此方法写一个XmlBuilder。
(完)
编程新说
用独特的视角说技术
JsonBuilder初出茅庐的更多相关文章
- json学习系列(7)JSONBuilder的用法
JSONBuilder可以向文件中写入写入json字符串.如下面的例子: public class Test { public static void main(String args[]) thro ...
- 免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐
免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐 隐鹤 倾心开发 2019.4.1 1. 引言 经过前后大约零零散散的一年的开发, ...
- 前端学习—React—初出茅庐
React学习—初出茅庐 对与React的学习思路,首先React中用到了Class.let.const.以及modual(模块)的导入(import)和导出(export),而这些都是ECMAScr ...
- JSONBuilder的用法
一.JSONBuilder可以向文件中写入写入json字符串.如下面的例子: 1 public class Test 2 { 3 public static void main(String args ...
- Github学习之路-初出茅庐,接触Github,了解Github
一.了解GitHub 作为一个在线协作网站,GitHub允许程序员们分享和协力于开源项目的工作. GitHub不仅是一个分享开源创作并与其它程序员合作的好地方,你也可以从GitHub上收到自己作品的 ...
- 基于python的接口测试学习笔记一(初出茅庐)
第一次写博客笔记,讲一下近来学习的接口自动化测试.网上查阅了相关资料,最后决定使用python语言写接口测试,使用的是python的第三方库requests.虽然python本身标准库中的 urlli ...
- Linux命令之初出茅庐
此处讲解常用到的参数选项: ls 是列出文件的意思 ls -a ,查看所有文件包含隐藏文件 ls -l ,查看与文件相关的所有属性信息 ls -i ,查看文件的inode信息 ls -h,按照更为容易 ...
- 一个看起来不像中年人的中年人,带着两个初出茅庐的小伙子儿,用git管理项目代码的进击之路
一个中年人的孤独前行 我们这一代人,是上个世纪的人,活在当下,已然成为社会上的中流砥柱. 80年代生人,遥望我们的父辈,均是5.60年代的人,迟迟暮年,夕夕老矣.而我们,正当年,却又时光飞逝,很快便要 ...
- Go学习之初出茅庐
在一个月黑风高的夜晚,机缘巧合与Go语言一面之缘,被她的简洁.灵活.高效所吸引,让我有深入学习的冲动,现在开始我的成长之路吧.
随机推荐
- 每日一练ACM
2019.04.15 第1000题:A+B Problem Problem DescriptionCalculate A + B. InputEach line will contain two in ...
- spring的一个小例子(二)--解析前面的小例子
接上篇:http://www.cnblogs.com/xuejupo/p/5236448.html 首先应该明白,一个web项目,web.xml是入口. 然后下面来分析上篇博客中出现的web.xml: ...
- restful状态码常用
在进行后端接口API封装的过程中,需要考虑各种错误信息的输出.一般情况下,根据相应问题输出适合的HTTP状态码,可以方便前端快速定位错误,减少沟通成本. HTTP状态码有很多,每个都有对应的含义,下面 ...
- java开发师笔试面试每日8题(1)
1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.使用fin ...
- SVN客户端操作
版权声明:本文为博主原创文章,转载请注明原文出处. https://blog.csdn.net/zzfenglin/article/details/50937119 下面我们来了解一下SVN客户端 ...
- django中使用memcache的一些注意事项
最近写django项目时在保存验证码方面要用到memcached,于是便查看了一些教程进行操作,结果确遇到了一系列问题,以下是一些容易遇到的雷区: 1.windows下memcached安装: -wi ...
- dva-counter
dva实例Counter. import dva, { connect } from 'dva'; import { Router, Route } from 'dva/router'; import ...
- IDEA 的黄线标注 取消
用IDEA经常会遇到found duplicate code的问题,下面有黄线标注,严重影响强迫症患者的使用.下面就是如何取消的方法 在设置中把这个勾取消即可1 转载于: https://blog. ...
- 《java从入门到精通》学习记录
目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...
- java(一) 基础部分
1.11.简单讲一下java的跨平台原理 Java通过不同的系统.不同版本.不同位数的java虚拟机(jvm),来屏蔽不同的系统指令集差异而对外体统统一的接口(java API),对于我们普通的jav ...