json-c

简介

json-c 是 C 语言写的一套构建和解析 JSON 的库。

1
2
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.
It aims to conform to RFC 7159.

使用 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
2
3
4
5
./configure --prefix=/Users/man/Desktop/json-c
make
make install

注意:/Users/man/Desktop/json-c 要写绝对路径,否则编译报错。

如果要支持多线程,可以加上 --enable-threading 这个选项,即:

1
2
3
4
5
./configure --enable-threading --prefix=/Users/man/Desktop/json-c
make
make install

编译成功后,在 json-c 会生成对应的库和头文件,如下:

使用 json-c

编译成功后,可以试用一下 json-c 这个库了,我把 libjson-c.a 和对应的 include 文件夹放进 macOS 工程,编译无法通过,报错,然后换为 libjson-c.4.dylib 编译通过但是运行报错,意思是无法加载该库。

同样道理,在 iOS 工程上面直接使用这两个库也是无法使用。

于是我就使用 lipo 来查看一下库所支持的架构,看一下下面的结果。

1
2
3
4
5
6
7
$ lipo -info libjson-c.a
Non-fat file: libjson-c.a is architecture: x86_64
$ lipo -info libjson-c.4.dylib
Non-fat file: libjson-c.4.dylib is architecture: x86_64

可以看出两个库均可以支持 x86_64,按道理是可以支持 macOS 和 iOS 模拟器运行的,macOS 上面可以使用 set | grep "MACHTYPE" 命令查看其操作系统架构。

libjson-c.a 是静态库,libjson-c.4.dylib 是动态库,可以使用 file 命令查看。

1
2
3
4
5
6
7
$ file libjson-c.a
libjson-c.a: current ar archive
$ file libjson-c.4.dylib
libjson-c.4.dylib: Mach-O 64-bit dynamically linked shared library x86_64

注意:显示 ar archive 表示是静态库。

最后自己没有找到好的办法,只能采取第二个办法,源码直接放进 Xcode 工程里面编译使用。

在放进 Xcode 工程之前,需要将下载的源码进行配置操作,即:

1
./configure

这样会产生对应 config.h 等文件,然后将源码中所有 .h.c 的文件拷贝至工程中即可编译使用了。

注意:如果不执行 ./configure 操作,拷贝的源文件不全,无法通过编译。

简单例子,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#import "ViewController.h"
#import "json-c/json.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
json_object *jsonObj = NULL;
jsonObj = json_tokener_parse("{ \"uid\": 12, \"name\": \"foobar\", \"isComer\": 1, \"age\": 21, \"extras\": [ 11, 52, 3, \"unknow\", 75 ] }");
const char *jsonString = json_object_to_json_string(jsonObj);
printf("obj.to_string()=%s\n", jsonString);
}
@end

对应输出结果,如下:

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 文档


本次分享,告辞!


扫码关注,你我就各多一个朋友~

坚持原创技术分享!