ag亚游app
  咨询电话:15361715699

AG国际APP

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。

 

 

(完)

 

编程新说


用独特的视角说技术