赞
踩
JSON是个什么东东?
JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
JSON 是轻量级的文本数据交换格式,是存储和交换文本信息的语法。类似 XML。
JSON 比 XML 更小、更快,更易解析。
JSON 具有自我描述性,更易理解
JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。
JSON书写格式:
我们要知道JSON 语法是 JavaScript 对象表示语法的子集。那么遵循以下几个要求:
数据在键/值对中
数据由逗号分隔
中括号保存数组
大括号保存对象
1.object格式(对象格式)
JSON对象是一个无序的键值对的集合。一个JSON对象以“{”(左括号)开始,“}”(右括号)结束。每个“键”后跟一个冒号,键值对之间使用逗号分隔。如下:
//前后端分离,推荐后端返回给前端数据格式
{
"idx" : 0 , /
"st" : "SUCCESS",
"data" : [ { //对象中嵌套数组,数组是返回的数据,
"id" : 1 ,
"name" : "xiaohong"
},
{
"id" : 2,
name" : "xiaoming"
}
]
}
还可以简单写法:key和数字可以不加""号,
2.arry格式(数组格式)
数组是值的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用逗号分隔。如下:
[
{
"id" : 1 ,
"name" : "ming"
},
{
"id" : 2 ,
"name" : "hong"
}
]
3.数组+对象格式(比较复杂)
也就是数组里面套对象,或者对象里面套数组。或者对象里面套对象等等。在上面的例子中也可以体现出来。
这里强调一下,JSON 值可以是:数字(整数或浮点数),字符串(在双引号中),逻辑值(true 或 false),数组(在中括号中),对象(在大括号中)以及空指针null。
JSON Viewer软件
/* cJSON 类型定义: /
#define cJSON_Invalid (0)
#define cJSON_False (1 << 0)
#define cJSON_True (1 << 1)
#define cJSON_NULL (1 << 2)
#define cJSON_Number (1 << 3)
#define cJSON_String (1 << 4)
#define cJSON_Array (1 << 5)
#define cJSON_Object (1 << 6)
#define cJSON_Raw (1 << 7) / raw json /
稍加翻译
/ cJSON 结构体: */
typedef struct cJSON
{
struct cJSON *next, *prev; //next/prev 遍历 数组或对象的前后指针. 或者使用GetArraySize/GetArrayItem/GetObjectItem
struct cJSON *child; // 当类型为Array或者Object指向第一个元素,否则=NULL
int type; // value的类型, 如上.
char *valuestring; // 当类型为String或者Raw时valued的字符串值 ,否则为NULL
int valueint;
double valuedouble; // 类型为Number时 valued的值。int valueint已经被弃用,建议使用cJSON_SetNumberValue函数来赋值,valuedouble也会被赋值
char *string; // key的字符串值.
} cJSON;
要生成的JSON文件如下:
//生成一个JSON文件 #include <stdio.h> #include <string.h> #include "cJSON.h" //这一步后面会说到 int main(int argc, const char* argv[]) { // 创建json对象 cJSON* obj = cJSON_CreateObject(); // 创建子对象 - 品牌 cJSON* brand = cJSON_CreateObject(); // 添加键值对 cJSON_AddItemToObject(brand, "factory", cJSON_CreateString("一汽大众")); cJSON_AddItemToObject(brand, "last", cJSON_CreateNumber(31)); cJSON_AddItemToObject(brand, "price", cJSON_CreateNumber(83)); cJSON_AddItemToObject(brand, "sell", cJSON_CreateNumber(49)); cJSON_AddItemToObject(brand, "sum", cJSON_CreateNumber(80)); // 创建json数组 cJSON* array = cJSON_CreateArray(); cJSON_AddItemToArray(array, cJSON_CreateNumber(124)); cJSON_AddItemToArray(array, cJSON_CreateString("hello, world")); cJSON_AddItemToArray(array, cJSON_CreateBool(0)); cJSON_AddItemToObject(brand, "other", array); cJSON_AddItemToObject(obj, "奔驰", brand); // 格式化json对象 char* text = cJSON_Print(obj); FILE* fp = fopen("car.json", "w"); fwrite(text, 1, strlen(text), fp); fclose(fp); return 0; }
//解析自己写的JSON文件 #include <stdio.h> #include <string.h> #include "cJSON.h" int main(int argc, const char* argv[]) { if(argc < 2) { printf("./a.out jsonfile\n"); return 0; } // 加载json文件 FILE* fp = fopen(argv[1], "r"); char buf[1024] = {0}; fread(buf, 1, sizeof(buf), fp); cJSON* root = cJSON_Parse(buf); cJSON* subobj = cJSON_GetObjectItem(root, "奔驰"); // 判断对象是否存在 if( subobj ) { // 获取子对象 cJSON* factory = cJSON_GetObjectItem(subobj, "factory"); cJSON* last = cJSON_GetObjectItem(subobj, "last"); cJSON* price = cJSON_GetObjectItem(subobj, "price"); cJSON* sell = cJSON_GetObjectItem(subobj, "sell"); cJSON* sum = cJSON_GetObjectItem(subobj, "sum"); cJSON* other = cJSON_GetObjectItem(subobj, "other"); // 打印value值 printf("奔驰:\n"); printf(" factory: %s\n", cJSON_Print(factory)); printf(" last: %s\n", cJSON_Print(last)); printf(" price: %s\n", cJSON_Print(price)); printf(" sell: %s\n", cJSON_Print(sell)); printf(" sum: %s\n", cJSON_Print(sum)); // 打印数组内容 printf(" other:\n"); if(other->type == cJSON_Array) { for(int i=0; i<cJSON_GetArraySize(other); ++i) { cJSON* node = cJSON_GetArrayItem(other, i); // 判断数据类型 if(node->type == cJSON_String) { printf(" %s \n", node->valuestring); } if(node->type == cJSON_Number) { printf(" %d\n", node->valueint); } if(node->type == cJSON_True) { printf(" %d\n", node->valueint); } if(node->type == cJSON_False) { printf(" %d\n", node->valueint); } } } } cJSON_Delete(root); fclose(fp); return 0; }
注意:因为在cJSON库有一个C文件和一个头文件,所以只需复制cJSON.h并复制cJSON.c到项目源,然后在你写的源码中加上头文件.h即可。
参考博客:请点击查阅!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。