为什么80%的码农都做不了架构师?>>>   

jcat是一个shell下的解析json的工具,具有以下功能:

  1. 支持指定路径解析,打印指定路径下的所有对象信息
  2. 支持宏路径,可以级联宏替换
  3. 使用tbox进行了跨平台支持,预编译版本直接可以在./tbox/tool目录下找到,因为新版tbox makefile架构就是采用jcat来解析*.pkg/manifest.json清单文件

使用方式拿polarssl.pkg/manifest.json的举例: { "format": { "name": "The TBOOX Package Format" , "version": "v1.0.1" , "website": "http://www.tboox.org" }

,   "package":{"name":         "The PolarSSL Library",   "website":      "http://www.polarssl.org"},   "compiler": {"default":{"debug":{"libs":         "polarssl",   "libpath":      "",   "incpath":      "",   "libflags":     "",   "incflags":     ""},   "release":          "$.compiler.default.debug"},   "linux" :{"x64":      "$.compiler.default"},   "mac" :{"x86":      "$.compiler.default",   "x64":      "$.compiler.default"},   "msvc" :{"x86":      "$.compiler.default"},   "mingw" :{"x86":      "$.compiler.default"},   "cygwin" :{"x86":      "$.compiler.default"},   "ios" :{"armv7":    "$.compiler.default",   "armv7s":   "$.compiler.default",   "arm64":    "$.compiler.default"},   "android" :{"armv5te":  "$.compiler.default",   "armv6":    "$.compiler.default"}}
}

上述manifest.json中,以$开头的字符串均为宏路径,例如:$.compiler.default,用来引用其他地方的配置数据,减小配置冗余

执行jcat, 获取 .compiler.mac.x64.debug 路径的内容

./tool/jcat/jcat --filter=.compiler.mac.x64.debug ./pkg/polarssl.pkg/manifest.json

返回结果如下:

{"incpath":"","incflags":"","libs":"polarssl","libflags":"","libpath":""}

是不是很方便?解析过程可以递归处理替换宏路径,返回真实的数据。其他详细使用方式,可以通过如下命令获取:

./tool/jcat/jcat --help

看了使用过程,是不是觉得实现这样一个jcat很复杂呢,其实非常简单,只要使用TBOX的object库,可以非常方便的实现它,下面就晒下jcat的代码吧:

#include "tbox/tbox.h"static tb_option_item_t g_options[] =
{{   'f',   "filter",   TB_OPTION_MODE_KEY_VAL,   TB_OPTION_TYPE_CSTR,   "the json filter\n"".e.g\n""\n""file:\n""{\n""    \"string\":       \"hello world!\"\n"",   \"com.xxx.xxx\":  \"hello world\"\n"",   \"integer\":      31415926\n"",   \"array\":\n""    [\n""        \"hello world!\"\n""    ,   31415926\n""    ,   3.1415926\n""    ,   false\n""    ,   true\n""    ,   { \"string\": \"hello world!\" }\n""    ]\n"",   \"macro\":        \"$.array[2]\"\n"",   \"macro2\":       \"$.com\\\\.xxx\\\\.xxx\"\n"",   \"macro3\":       \"$.macro\"\n"",   \"macro4\":       \"$.array\"\n""}\n""\n""filter:\n""    1. \".string\"               : hello world!\n""    2. \".array[1]\"             : 31415926\n""    3. \".array[5].string\"      : hello world!\n""    4. \".com\\.xxx\\.xxx\"        : hello world\n""    5. \".macro\"                : 3.1415926\n""    6. \".macro2\"               : hello world\n""    7. \".macro3\"               : 3.1415926\n""    8. \".macro4[0]\"            : \"hello world!\"\n"}
,   {'h',   "help",         TB_OPTION_MODE_KEY,         TB_OPTION_TYPE_BOOL,        "display this help and exit"}
,   {'-',   "file",         TB_OPTION_MODE_VAL,         TB_OPTION_TYPE_CSTR,        "the json file"             }};/* //* main*/
tb_int_t main(tb_int_t argc, tb_char_t** argv)
{// init tboxif (!tb_init(tb_null, tb_null, 0)) return 0;// init optiontb_option_ref_t option = tb_option_init("jcat", "cat the json file", g_options);if (option){// done optionif (tb_option_done(option, argc - 1, &argv[1])){// done fileif (tb_option_find(option, "file")){// load objecttb_object_ref_t root = tb_object_read_from_url(tb_option_item_cstr(option, "file"));if (root){// done filtertb_object_ref_t object = root;if (tb_option_find(option, "filter")) object = tb_object_seek(root, tb_option_item_cstr(option, "filter"), tb_true);// dump 数据对象,这里主要为了过滤 字符串内容的 ""// 否则直接使用tb_object_dump会更简单,只需一行代码if (object) {// donetb_char_t info[8192] = {0};tb_long_t size = tb_object_writ_to_data(object, (tb_byte_t*)info, sizeof(info), TB_OBJECT_FORMAT_JSON | TB_OBJECT_FORMAT_DEFLATE);if (size > 0){// strip string: ""tb_char_t* show = info;if (info[0] == '\"' && info[size - 1] == '\"'){show++;info[size - 1] = '\0';}// tracetb_printf("%s\n", show);}}// exit objecttb_object_exit(root);}}else tb_option_help(option);}else tb_option_help(option);// exit optiontb_option_exit(option);}// exit tboxtb_exit();// okreturn 0;
}

简单吧,就只要一百行代码,还支持详细的命令行选项支持。

附带一句:其实jcat同时还可以支持解析xml和plist哦,因为他用了object模块的多数据格式探测功能,完全可以自动解析不同格式的数据,还能方便扩展自己的数据格式。


  • TBOX项目详情
  • TBOX项目源码
  • TBOX项目文档

转载于:https://my.oschina.net/tboox/blog/361160

实现json解析工具jcat相关推荐

  1. 一文吃透Json解析工具类合集(FastJson、Jackson、Gson)

    Json解析工具类 前言 一.各个JSON技术的简介 1.1 FastJson角色 1.2 Jackson角色 1.3 Gson角色 二.使用步骤 2.1 引入库 1.FastJson依赖 2.Jac ...

  2. Json解析工具Jackson(使用注解)

    接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给我们提供了一系列注解,提高了开发的灵活性,下面介绍一下最常用的一些注解 @JsonIgnoreProperties ...

  3. JSON解析工具比较,主要GSON和FastJSON

    转自:http://www.cnblogs.com/kunpengit/p/4001680.html 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的 ...

  4. Java:JSON解析工具-org.json

    一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...

  5. 自定义Json解析工具

    此博客为博主原创文章,转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10689536.html fastjson是很好用的json解析工具,只可惜项目中要 ...

  6. json解析工具(json解析工具 python)

    常用的xml,json解析工具有哪些 1.定义介绍 (1).XML定义 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可 ...

  7. Java常用的几种JSON解析工具

    一.Gson:Google开源的JSON解析库 1.添加依赖 <!--gson--> <dependency><groupId>com.google.code.gs ...

  8. FastJson快速上手【Json解析工具】

    目录 一.spring boot工程中引入FastJson依赖 二.调用JSON类的静态方法直接进行json序列化和反序列化 2.1 序列化 2.2 反序列化 三.快速演示: 四.思考 五.web案例 ...

  9. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

最新文章

  1. Chrome插件HostAdmin
  2. 字节跳动Deep Retrieval召回模型笔记
  3. 排列、组合问题(递归)
  4. MySQL Mac安装教程
  5. python的模块提供了许多文件处理方法_详解使用Python处理文件目录的相关方法
  6. bzoj3533 [Sdoi2014]向量集 可持久化凸包+二分
  7. 如何在矩池云内置Jupyter中访问网盘中的文件呢?
  8. C#中WinForm 父窗体和子窗体传值
  9. Python: 生成器,yield
  10. Linux串口(serial、uart)驱动程序设计
  11. 【雷达通信】基于matlab粒子群算法优化综合微带天线阵列方向图【含Matlab源码 1967期】
  12. 计算机网络按网络覆盖范围大小排序 从小到大为,现代远程网络教育概论试题及答案分析.pdf...
  13. 动态规划(Dynamic Programming)算法与LC实例的理解
  14. OpenCV4学习笔记(59)——高动态范围(HDR)成像
  15. 淘宝直通车如何打造爆款,直通车爆款秘籍
  16. Xshell 下载地址
  17. SOCKET实现广播(BoardCast)的发送和接收 (转)
  18. 利用tldr工具再也不怕记不住Linux命令
  19. 数字电路和模拟电路-3二极管与三极管、基本逻辑运算
  20. 中国电信推出量子加密通话;中国建成世界最大量子通信网络|全球量子科技与工业快讯第四期

热门文章

  1. mysql8 之 创建、删除用户和授权、消权操作
  2. TCP协议-长连接和短连接
  3. d:/aaa下面有一个视频文件 复制到d:/bbb下面
  4. 机器学习——使用ID3算法从原理到实际举例理解决策树
  5. 做副业赚钱,这几个热门自媒体平台收益超多
  6. js中Object常用方法和属性
  7. 【NLP】对比学习——文本匹配(一)
  8. 隐藏android系统自带应用程序
  9. Pytho的基础使用方法
  10. 数据挖掘十大算法(九):朴素贝叶斯 python和sklearn实现