背景
JSON即JavaScript Object Notation,是一种轻量级的数据交换格式。
JSON建构于两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
关于JSON库的性能评测与标准符合程度,可以参照《28 个 C/C++ 开源 JSON 程序库性能及标准符合程度评测》,另一个英文版更详细结果在nativejson-benchmark。
在阅读了一系列评测之后,结合需求(ROM尽量小,RAM尽量小,带处理的数据比较简单),准备研究一下cJSON和json-c。
从JSON官网获得json-c和cJSON的源码地址如下:cJSON和json-c。
下面就基于这两份代码在Ubuntu进行速度和兼容性测试。
测试标的构造对于测试的覆盖以及测试有效性非常重要,所幸的在AOSP中有一个参考AOSP/external/jsoncpp/test。
cJSON
下载代码:
git clone https://github.com/arnoldlu/cJSON.git |
编译安装:
mkdir build cd build cmake .. -DENABLE_CJSON_UTILS=Off -DENABLE_CJSON_TEST=On -DCMAKE_INSTALL_PREFIX=/usr (生成bin+lib) cmake .. -DENABLE_CJSON_UTILS=Off -DENABLE_CJSON_TEST=On -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_SHARED_LIBS=Off (生成bin) make sudo make install (安装libcjson.so) |
参考文档:《使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解》、《cJSON学习笔记》。
下面是一个构造JSON数据,然后解析,打印Type-Key-Value的小示例:
#include <stdio.h> void printJson(cJSON *root) static char * makeJson(void) pJsonRoot = cJSON_CreateObject(); p = cJSON_Print(pJsonRoot); cJSON_Delete(pJsonRoot); return p;
if(NULL == pMsg) pJson = cJSON_Parse(pMsg); pSub = cJSON_GetObjectItem(pJson, "hello"); pSub = cJSON_GetObjectItem(pJson, "number"); pSub = cJSON_GetObjectItem(pJson, "bool"); pSub = cJSON_GetObjectItem(pJson, "subobj"); pSubSub = cJSON_GetObjectItem(pSub, "subjsonobj"); cJSON_Delete(pJson); int main(void) /* print the version */ p = makeJson(); 构造JSON数据 |
在安装(sudo make install)cJSON之后,编译的时候需要跟上libcjson库文件:
gcc demo.c -o demo -lcjson |
执行结果如下:
Version: 1.3.2 Type=0x10, hello="hello world" |
json-c
参考文档:《JSON C库的使用》
下载代码:
git clone https://github.com/arnoldlu/json-c.git |
编译安装:
sh autogen.sh ./configure make make install |
- 推荐文章
- Ubuntu 16.04 系统基础开发环境搭建
- Log4net 的 ASP.NET Core 扩展库
- MySQL8数据库 | MySQL调优|MySQL底层原理|MySQL零基础新手教程
- [oBIX包使用教程] 使用 Python 通过 oBIX 协议访问 Niagara 数据
- [Python] iupdatable包:Timer 类使用介绍
- [Python] iupdatable包:Status 模块使用介绍
- Process.Start 方法 (String, String)参数本身带有空格的解决方法
- 快速创建自建CA证书
- Serilog 源码解析——总览
- Serilog 源码解析——数据的保存(下)
- Serilog 源码解析——数据的保存(中)
- Serilog 源码解析——数据的保存(上)
- Serilog 源码解析——解析字符串模板
- Serilog 源码解析——Sink 的实现
- Serilog 源码解析——使用方法
- Serilog 源码解析——Demo 实现(下)
- Serilog 源码解析——Demo 实现(上)
- 源码上看 .NET 中 StringBuilder 拼接字符串的实现
- 2059
- Mac笔记本关闭SIP功能
- Mac 如何开启任何来源选项
- Fiddler抓包工具总结
- Inpaint>>一款神奇的去水印工具
- Adobe After Effects 2021 中文版 视频特效制作软件
- 利用百度接口实现免费文字转语音
- 普通电脑如何实现网吧锁屏?让你的电脑实现网吧挂机锁功能的方法
- 一款强大的思维导图软件-XMind:ZEN 2020v10.0-免费安装与使用
- 教你用 Python 修改微信(支付宝)运动步数,轻松升到 TOP1
- C# Winforn窗体的Load事件和Shown事件的区别
- 判断输入的字符串是否是合法路径,并验证后面的输入是否含有非法字符