为什么要用json
跟XML相比,JSON的优势在于格式简洁短小,特别是在处理大量复杂数据的时候,这个优势便显得非常突出。从各浏览器的支持来看,JSON解决了因不同浏览器对XML
目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。
我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识。
从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。
一、json_encode()
该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:
$arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr);
结果为
{"a":1,"b":2,"c":3,"d":4,"e":5}
再看一个对象转换的例子:
$obj->body = 'another post'; $obj->id = 21; $obj->approved = true; $obj->favorite_count = 1; $obj->status = NULL; echo json_encode($obj);
结果为
{ "body":"another post", "id":21, "approved":true, "favorite_count":1, "status":null }
由于json只接受utf-8编码的字符,所以json_encode()的参数必须是utf-8编码,否则会得到空字符或者null。当中文使用GB2312编码,或者外文使用ISO-8859-1编码的时候,这一点要特别注意。
前文出自:http://www.ruanyifeng.com/blog/2011/01/json_in_php.html
从上面的介绍,我们可以知道php对json的支持可以说是做到非常方便了。那c呢?
先看json的数据结构
c中没有对象,所以json数据是采用链表存储的
- typedef struct cJSON {
- struct cJSON *next,*prev; // 数组 对象数据中用到
- struct cJSON *child; // 数组 和对象中指向子数组对象或值
- int type; // 元素的类型,如是对象还是数组
- char *valuestring; // 如果是字符串
- int valueint; // 如果是数值
- double valuedouble; // 如果类型是cJSON_Number
- char *string; // The item's name string, if this item is the child of, or is in the list of subitems of an object.
- } cJSON;
比如你有一个json数据
- {
- "name": "Jack (\"Bee\") Nimble",
- "format": {
- "type": "rect",
- "width": 1920,
- "height": 1080,
- "interlace": false,
- "frame rate": 24
- }
- }
那么你可以
1:讲字符串解析成json结构体。
- cJSON *root = cJSON_Parse(my_json_string);
2:获取某个元素
- cJSON *format = cJSON_GetObjectItem(root,"format");
- int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint;
3:讲json结构体转换成字符串
- char *rendered=cJSON_Print(root);
4:删除
- cJSON_Delete(root);
5:构建一个json结构体
- cJSON *root,*fmt;
- root=cJSON_CreateObject();
- cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));
- cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());
- cJSON_AddStringToObject(fmt,"type", "rect");
- cJSON_AddNumberToObject(fmt,"width", 1920);
- cJSON_AddNumberToObject(fmt,"height", 1080);
- cJSON_AddFalseToObject (fmt,"interlace");
-
cJSON_AddNumberToObject(fmt,"frame rate", 24);
也是一样方便的。
其实个人理解的json也是字符串,前后台如何传递字符串呢?
可以通过数据库。也可以通过文件。
也可以通过前台直接放入函数入库(不够灵活)。