zoukankan      html  css  js  c++  java
  • 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。

     

     

    (完)

     

    编程新说


    用独特的视角说技术

  • 相关阅读:
    javascript事件流讲解和实例应用
    Javascripts事件基础和事件绑定
    javascript-节点属性详解
    js数据类型检测的四种方式
    原生JS的window.onload与Jquery的$(document).ready(function() {}),$(function () {})有什么不同?
    Js字符串方法大全
    什么是原型链?
    new操作符具体干了什么呢
    document.write和innerHTML的区别
    一个页面从输入URL到页面加载显示完成,这个过程中都发生了什么?
  • 原文地址:https://www.cnblogs.com/lixinjie/p/json-builder.html
Copyright © 2011-2022 走看看