什么是json???
JSON (JavaScript Object Notation)是一种用于在组件间交互信息的数据交换格式,其是以JavaScript 为基础的数据表示语言。既方便于人的读写习惯,又有利于计算机的解析和生成。
JSON 是在以下两种数据结构的基础上来定义其基本的数据描述格式的:
1)含有名称/值对的集合(collection)。对于不同的语言,其被解析为与之相对应的对象、
记录、结构体、列表、集合、哈希表以及关联数组等数据结构。
2)一个有序的列表(list)。一般对应于具体语言的一个数组的数据结构。
形如{“name”:”ldxian”,”age”:23}就表示一个JSON 对象,其有两个属性,值分别为ldxian
和23。其余的如字符串、数字、注释等跟其他编程语言差不多。
-------------------------分隔符-----------------------------------
什么是json-rpc?
rpc:远程过程调用;
JSON-RPC:一种json格式的远程过程调用协议
题外话:
远程过程调用(RPC)[1]是一种从远程计算机程序上请求一个服务器,而不需要了解上层网络技术的协议。
rpc是一种中间件技术,及远程调用中间件。
中间件技术是伴随网络而发展起来的一种面向对象的技术,中间件是一个转换器,把一端的资源转换为另一端所能接受的形式供给对方处理。
按照IDC 的分类方法,中间件可分为六类:数据访问中间件、远程过程调用(RPC)中间件、消息中间件、交易中间件、对象中间件等。
##JSON 格式的请求request
客户端通过向远程服务发送一个请求的方式来实现对远程方法的调用,而这个请求是一
个由JSON 协议串行化的对象,含有下面三个属性:
·method:被调用方法名;
·params:被调用方法的参数列表;
·id :请求id,可以是任何类型,用于与响应匹配。
请求service.执行echo("Hello JSON-RPC") ,然后server通过response返回结果
--> { "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
##JSON 格式的响应response
当某个方法调用完成后,服务器必须给出一个由JSON 协议串行化的对象作为响应,其
有三个属性:
·result:是一个由被调用方法返回的对象,如果错误调用方法时,则其值为null;
·error:如果没有错误调用方法,则其值为null;
·id :与要响应的请求的id 相同。
<-- { "result": "Hello JSON-RPC", "error": null, "id": 1}
##JSON 通告notification
一个notification 是一个没有响应的特殊请求,其也是由JSON 协议串行化的对象,含有
和一般请求相同的属性,但是其id 为null。
请求service.执行echo("Hello JSON-RPC") ,然后server无需返回结果
--> { "method": "echo", "params": ["Hello JSON-RPC"]}
[1] RPC 协议规范详细介绍rfc1057:http://www.faqs.org/rfcs/rfc1057.html。
[2] 关于JSON:http://www.json.org。
[3] JSON-RPC 及其相关资料:http://www.json-rpc.org/。
[4] JSON-RPC-Java: http://oss.metaparadigm.com/jsonrpc/。
[5] 关于JSON 与XML 的比较:http://www.crockford.com/JSON/XML.html。
----------------------------------------------------------------------------------------------------------------------------------------
1、下载并解压json-c-0.9
#wget http://oss.metaparadigm.com/json-c/json-c-0.9.tar.gz
#tar -zxvf json-c-0.9.tar.gz
2、编译json-c-0.9
#cd json-c-0.9/
# ./configure --prefix=/home/usrname/json/out --enable-shared
#make && make install
3、测试json-c-0.9的例子:
#gcc -I/home/usrname/json/out/include/json/ -L/home/usrname/json/out/lib test2.c -D__STRICT_ANSI__ -ljson -o test2
#export LD_LIBRARY_PATH=/home/usrname/json/out/lib
#./test2
其中 -D__STRICT_ANSI__ 是为了消除c99的编译选项。
结果
new_obj.to_string()={ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": [ { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": [ "GML", "XML", "markup" ] } ] } } }
test2.c的程序
int main(int argc, char **argv) { json_object *new_obj; //声明json对象 MC_SET_DEBUG(1); //debug 使能 //json_tokener_parse :将json格式的string转化为json对象的方法 new_obj = json_tokener_parse("/* more difficult test case */ { \"glossary\": { \"title\": \"example glossary\", \"GlossDiv\": { \"title\": \"S\", \"GlossList\": [ { \"ID\": \"SGML\", \"SortAs\": \"SGML\", \"GlossTerm\": \"Standard Generalized Markup Language\", \"Acronym\": \"SGML\", \"Abbrev\": \"ISO 8879:1986\", \"GlossDef\": \"A meta-markup language, used to create markup languages such as DocBook.\", \"GlossSeeAlso\": [\"GML\", \"XML\", \"markup\"] } ] } } }"); //json_object_to_json_string:将json对象转化为json格式的string //打印输出json格式的string printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj)); //json_object_put: 销毁一个json对象 json_object_put(new_obj); return 0; }