json-c
简介
json-c 是 C 语言写的一套构建和解析 JSON 的库。
1 | JSON-C implements a reference counting object model that allows you to easily construct JSON objects in C, output them as JSON formatted strings and parse JSON formatted strings back into the C representation of JSON objects. |
使用 C 语言编写的 JSON 库还有很多,可以在 介绍 JSON 中查找到,除了 C语言的还有其他语言编写的 JSON 开源库。
所有发布的 json-c
库版本在 这里 都可以找到,本篇编译的是 json-c-0.13.1-20180305 这个版本。
编译
一、下载、解压
直接下载最新版本 json-c-0.13.1-20180305,截止到本文发布该版本为最新版本。
解压刚才下载好的文件,解压后将文件夹重命名为 json-c-src
,当然你也可以不重名它。
打开 macOS 终端,进入 json-c-src
文件夹
1 | cd json-c-src |
二、源码编译
在编译之前,确保你已经在 macOS 中安装了下面的工具:
1、gcc, clang, 或者其他 C 编译器;
2、libtool 工具,版本不能低于 2.2.6b;
3、autoconf 工具,版本不能低于 2.64 (autoreconf);
4、automake工具,版本不能低于 1.13;
如果没有安装上面的工具,可以使用 Homebrew
进行安装。
在桌面新建个文件夹 json-c
,这个文件夹用来放待会编译后的文件(库和头文件)。
执行下面的命令开始配置和编译,如下:
1 | ./configure --prefix=/Users/man/Desktop/json-c |
注意:/Users/man/Desktop/json-c
要写绝对路径,否则编译报错。
如果要支持多线程,可以加上 --enable-threading
这个选项,即:
1 | ./configure --enable-threading --prefix=/Users/man/Desktop/json-c |
编译成功后,在 json-c
会生成对应的库和头文件,如下:
使用 json-c
编译成功后,可以试用一下 json-c
这个库了,我把 libjson-c.a
和对应的 include
文件夹放进 macOS 工程,编译无法通过,报错,然后换为 libjson-c.4.dylib
编译通过但是运行报错,意思是无法加载该库。
同样道理,在 iOS 工程上面直接使用这两个库也是无法使用。
于是我就使用 lipo
来查看一下库所支持的架构,看一下下面的结果。
1 | $ lipo -info libjson-c.a |
可以看出两个库均可以支持 x86_64,按道理是可以支持 macOS 和 iOS 模拟器运行的,macOS 上面可以使用 set | grep "MACHTYPE"
命令查看其操作系统架构。
libjson-c.a
是静态库,libjson-c.4.dylib
是动态库,可以使用 file
命令查看。
1 | $ file libjson-c.a |
注意:显示 ar archive
表示是静态库。
最后自己没有找到好的办法,只能采取第二个办法,源码直接放进 Xcode 工程里面编译使用。
在放进 Xcode 工程之前,需要将下载的源码进行配置操作,即:
1 | ./configure |
这样会产生对应 config.h
等文件,然后将源码中所有 .h
和 .c
的文件拷贝至工程中即可编译使用了。
注意:如果不执行 ./configure
操作,拷贝的源文件不全,无法通过编译。
简单例子,如下:
1 |
|
对应输出结果,如下:
1 | obj.to_string()={ "uid": 12, "name": "foobar", "isComer": 1, "age": 21, "extras": [ 11, 52, 3, "unknow", 75 ] } |
疑问
Objective-C 已经提供了关于 JSON 的库了,干嘛还折腾 json-c 呢?
的确,自从 iOS 5.0+,macOS 10.7+ 之后,Foundation
框架已经提供了 NSJSONSerialization
,我主要是好奇 json-c
这个库,看他的跨平台能力而已。
关于 NSJSONSerialization
可以查看 API 文档。
本次分享,告辞!
扫码关注,你我就各多一个朋友~