实现json解析工具jcat

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 tbox
    if (!tb_init(tb_null, tb_null, 0)) return 0;

    // init option
    tb_option_ref_t option = tb_option_init("jcat", "cat the json file", g_options);
    if (option)
    {
        // done option
        if (tb_option_done(option, argc - 1, &argv[1]))
        {
            // done file
            if (tb_option_find(option, "file"))
            {
                // load object
                tb_object_ref_t root = tb_object_read_from_url(tb_option_item_cstr(option, "file"));
                if (root)
                {
                    // done filter
                    tb_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)
                    {
                        // done
                        tb_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‘;
                            }

                            // trace
                            tb_printf("%s\n", show);
                        }
                    }

                    // exit object
                    tb_object_exit(root);
                }
            }
            else tb_option_help(option);
        }
        else tb_option_help(option);

        // exit option
        tb_option_exit(option);
    }

    // exit tbox
    tb_exit();

    // ok
    return 0;
}

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

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


时间: 2024-08-26 09:10:24

实现json解析工具jcat的相关文章

[转] 各种Json解析工具比较 - json-lib/Jackson/Gson/FastJson

JSON技术的调研报告 一 .各个JSON技术的简介和优劣1.json-libjson-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如

Java:JSON解析工具-org.json

一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网址https://github.com/douglascrockford/JSON-java下载org.json源码,并将源码其加入到Eclipse中,即可调用. 2.查看相关的API文档,访问:https://github.com/douglascrockford/JSON-java. https

Android应用之——谷歌官方Json解析工具Gson的使用

一.Gson简介 Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为串行化Java对象为JSON字符串,或反串行化JSON字符串成Java对象.也就是Java对象与json字符串间的互相转换,解析. 二.使用方法 Gson的应用主要为toJson与fromJson两个转换函数,而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象.即先创建好对应的javabean,javabean中的字段与要转换的

JSON解析工具-org.json使用教程

原文地址:http://www.open-open.com/lib/view/open1381566882614.html 一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网址https://github.com/douglascrockford/JSON-java下载org.json源码,并将源码其加入到Eclipse中,即可调用. 2.查看相关

【Android开发经验】超好用的json解析工具——Gson项目使用介绍

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在上一篇文章中,我们简单的介绍了json数据格式,并介绍了如何使用Android自带的json工具,完成json数据的生成与解析.但是就像我所说的,自带的工具类太难用了!因此这篇文章,会介绍一个json解析的非常好的工具,那就是google的开源项目Gson. 咱们这次不介绍Gson里面的常用类了,因为常用的几个类非常的简单,我们直接上手开始用,看看Gson是多么的强大! 当然,如果使用第三方的项目,我们

Json解析工具Jackson(简单应用)

概述    Jackson库(http://jackson.codehaus.org),是基于Java语言的开源json格式解析工具,整个库(使用最新的2.2版本)包含3个jar包:    jackson-core.jar--核心包(必须),提供基于"流模式"解析的API.    jackson-databind--数据绑定包(可选),提供基于"对象绑定"和"树模型"相关API.    jackson-annotations--注解包(可选),提

Json解析工具类

这篇文章我是怀着无比激动的心情写得,为啥为啥?因为都要放假了!你们的小心心是不是已经躁动不安了!族长考虑到现在离高速免费通行还有几个小时,大家也闲来无事,在下就写点让小伙伴们打发打发时间!今天我们就看一点通过Gson-2.3.1.jar封装的工具类!希望有助于你(温馨提醒:别看的忘了游玩出行的时间哦~~) 工具类 package com.sunfreeter.util; import com.google.gson.Gson;import com.google.gson.JsonElement;

Json解析工具类JsonHelper

利用Gson快速解析json 需要导入Gson包,解析成一个对象或一个包含此对象的list JsonHelper代码如下: import java.util.ArrayList; import java.util.List; import android.text.TextUtils; import com.google.gson.Gson; import com.google.gson.JsonParseException; import com.google.gson.JsonParser;

JSON 解析工具的封装(FastJSON-->Java)

1.添加依赖包 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.41</version> </dependency> 2.代码 package com.yys.common.util; import com.alibaba.fastjson.JSON; import com.al