互联网这股东风不久前刮到了甘凉国,国王老甘独具慧眼,想赶紧趁着东风未停大力发展移动互联网,因为他笃信布斯雷的理论:“站在风口上,猪都能飞起来”。无奈地方偏僻落后,国内无可用之才啊。老甘一筹莫展的低头凝思应声被打断,“启奏陛下,有四个从东土大唐来的和尚前来更换通关文牒”,听到“东土大唐”四个字,老甘心头一喜,答道:“请他们去正堂等候”。

唐僧:贫僧唐三藏,自东土大唐而来,前往西天拜佛求经,今途径贵国,恳请陛下更换通关文牒。
国王:高僧从东方而来,想必对互联网略知一二。
唐僧:贫僧也是略有耳闻,不过我的徒儿对此颇有研究。
国王:寡人现有一需求,还请高僧帮忙处理一下,事成之后,定放你们西行。需求文档一会发你。
唐僧:遵命,谢陛下。
国王:(发文档),@三藏。
唐僧:收到。
唐僧:@悟净,处理下文档中的需求。
沙僧:收到。

  对接接口繁琐复杂,还要多方联调。悟空虽然水平高,但是脾气不好,怕打起来;八戒好吃懒惰,恐难当此任;悟净,为师只有辛苦你了。唐僧心里想到此,不由得叹气一声。

沙僧:师傅,这文档写的乱七八糟、语句不通,很多入参、出参模糊不清,对方测试环境时好时坏,给他们打电话,他们说很忙暂时没时间管我。
唐僧:悟净,这些为师都知道。程序员都没什么文化,注释、文档总是写不好;而且非常苦逼,总是熬夜加班,所以没有时间。你应该理解以下。
沙僧:哎。。。入参报文格式为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。

(完)

编程新说


用独特的视角说技术

最新文章

  1. iis7.0与asp.net的运行原理
  2. 浅谈P2P金融
  3. 将javascript函数写在Html标签里
  4. html5文章 -- 使用 jQuery Mobile 与 HTML5 开发 Web App —— jQuery Mobile 基础
  5. oracle的会话(session)
  6. Interview----用最快的方法计算 Fibonacci 数
  7. Think Python - Chapter 17 - Classes and methods
  8. [ZOJ 1002] Fire Net (简单地图搜索)
  9. 处理SVN的提交代码冲突
  10. JIRA官方:JIRA项目跟踪
  11. 基于visual Studio2013解决C语言竞赛题之0602最大值函数
  12. 性能调优案例分享:jvm crash的原因 1
  13. UOJ #109「APIO2013」TASKSAUTHOR
  14. python 写入文件形式
  15. Django 的认识,面试题
  16. 安装mysqlclient的时候出现Microsoft Visual C++ 14.0 is required报错
  17. TP5调用微信JSSDK 教程 —— 之异步使用
  18. Python-Pool类
  19. Docker的学习
  20. Java - "JUC" Semaphore源码分析

热门文章

  1. C#在SharePoint文档库下动态新增文件夹
  2. CNN算法解决MNIST数据集识别问题
  3. 使用Eclipse的代码追踪功能
  4. 基于coridc算法的定点小数除法器的实现
  5. 【java源码】解读HashTable类背后的实现细节
  6. 《HTTP权威指南》4-连接管理
  7. 使用Consul 实现 MagicOnion(GRpc) 服务注册和发现
  8. #Java学习之路——基础阶段(第二篇)
  9. 微信小程序的概要
  10. 第57节:Java中流的操作以及编码解码