JsonBuilder初出茅庐

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

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

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

沙僧:师傅,这文档写的乱七八糟、语句不通,不少入参、出参模糊不清,对方测试环境时好时坏,给他们打电话,他们说很忙暂时没时间管我。
唐僧:悟净,这些为师都知道。程序员都没什么文化,注释、文档老是写很差;并且很是苦逼,老是熬夜加班,因此没有时间。你应该理解如下。
沙僧:哎。。。入参报文格式为json,且很是复杂,我拼了一上午报文,每次都返回入参报文格式不正确。
唐僧:你是怎么拼json格式的报文呢?
沙僧:传统方法啊,先用Map和List组合好,再转成json字符串。
唐僧:若是json很是复杂的话,要定义好多Map和List,光起些好点儿的名字就够头大的,还要再互相嵌套起来,稍有不慎,很容易出错。真是够够的了。并且要写不少代码。
沙僧:谁说不是呢,师傅有什么好方法吗?
唐僧:json结构你应该很熟悉,它是一个自我嵌套的递归结构。那咱们就来设计一个构建器来直接构建json字符串,就叫JsonBuilder吧。
沙僧:我忽然想起StringBuilder,它的流式api很是好用,快捷方便。只是字符串是一维的,只有前后顺序,但json是二维的,既有前后顺序,还有内外顺序。
唐僧:你说的内外顺序其实就是父子关系,这也很好处理。
  1)只需维护一个指向当前级别的指针,若是只是添加简单的key-value,当前级别保持不变。
  2)若是添加了复合value(子节点),当前指针指向新添加的级别(深刻一级),此时该级别就成了新的当前级别。
  3)当前级别结束后只需回到父级别(退出一级),此时父级别就又成了新的当前级别,如此往复下去便可。
沙僧:师傅,恕徒儿愚钝,您讲的太抽象了,能不能举个例子。
唐僧:看下面的json,api

{
  "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();
沙僧:好的,只是这变量名字有点。。。但别光我一人啊,也让广大群众试试吧。测试

  悟净获得师傅的指点后,有一点小小的豁然开朗,决定本身去实现一把。但想到又开始去对接口,不禁得叹气一声,哎。。。ui

 

PS:也能够按照此方法写一个MapBuilder。
PS:也能够按照此方法写一个XmlBuilder。spa

 

 

(完)设计

 

编程新说指针


用独特的视角说技术

相关文章
相关标签/搜索