为什么要用json
跟XML相比,JSON的优势在于格式简洁短小,特别是在处理大量复杂数据的时候,这个优势便显得非常突出。从各浏览器的支持来看,JSON解决了因不同浏览器对XML DOM解析方式不同而引起的问题。
目前,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数据是采用链表存储的
C代码
typedefstructcJSON {
structcJSON *next,*prev;// 数组 对象数据中用到
structcJSON *child;// 数组 和对象中指向子数组对象或值
inttype;// 元素的类型,如是对象还是数组
char*valuestring;// 如果是字符串
intvalueint;// 如果是数值
doublevaluedouble;// 如果类型是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数据
Javascript代码
{
"name":"Jack (\"Bee\") Nimble",
"format": {
"type":"rect",
"width": 1920,
"height": 1080,
"interlace":false,
"frame rate": 24
}
}
那么你可以1:讲字符串解析成json结构体。
C代码
cJSON *root = cJSON_Parse(my_json_string);
2:获取某个元素
C代码
cJSON *format = cJSON_GetObjectItem(root,"format");
intframerate = cJSON_GetObjectItem(format,"frame rate")->valueint;
3:讲json结构体转换成字符串
C代码
char*rendered=cJSON_Print(root);
4:删除
C代码
cJSON_Delete(root);
5:构建一个json结构体
C代码
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也是字符串,前后台如何传递字符串呢?
可以通过数据库。也可以通过文件。
也可以通过前台直接放入函数入库(不够灵活)。