JSON简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。
JSON的两种结构:
- “名称/值”对的集合(A collection of name/value pairs)。
- 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
一个在线的JSON校验网址https://www.bbejson.com
JSON的形式
- 对象是一个无序的
名称/值
对集合。一个对象以{
(左括号)开始,}
(右括号)结束。每个“名称”后跟一个:
(冒号),在名称/值对之间使用 ,逗号 分隔。 - 数组是值(value)的有序集合。一个数组以
[
(左中括号)开始,]
(右中括号)结束。值之间使用,
(逗号)分割。 - 值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
- 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
- 数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
- 空白可以加入到任何符号之间。
JSON示例
# demo1
{
"name": "Susan",
"age": 27,
"birthday": {
"year": 1984,
"month": 2,
"day": 11
}
}
# demo2
{
"name": "Integrated Camera",
"vid": 5075,
"pid": 22041,
"format": [{
"type": "video/x-raw",
"width": 640,
"height": 480,
"fps": 30
},
{
"type": "video/x-raw",
"width": 960,
"height": 540,
"fps": 15
},
{
"type": "video/x-raw",
"width": 1280,
"height": 720,
"fps": 10
},
{
"type": "image/jpeg",
"width": 640,
"height": 480,
"fps": 30
},
{
"type": "image/jpeg",
"width": 960,
"height": 540,
"fps": 30
},
{
"type": "image/jpeg",
"width": 1280,
"height": 720,
"fps": 30
}
]
}
cJSON
简介
cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。使用时,只需要包含cJSON.h和cJSON.c两个文件即可。
使用示例
#include "cJSON.h"
#include <stdio.h>
#include <stdlib.h>
/*
创建一个json对象
{
"number": "00001",
"name":"zhang san",
"class":"140412"
}
*/
void test01()
{
cJSON* pRoot = cJSON_CreateObject(); //创建一个对象
if (!pRoot)
return;
cJSON_AddStringToObject(pRoot, "number", "00001"); //添加一个节点
cJSON_AddStringToObject(pRoot, "name", "zhang san");
cJSON_AddStringToObject(pRoot, "class", "140412");
char* szJson = cJSON_Print(pRoot);
if (szJson != NULL)
{
printf("%s\n", szJson);
free(szJson);
}
cJSON_Delete(pRoot);
}
/*
创建一个数组
[1,2,3,4]
*/
void test02()
{
cJSON* pRoot = cJSON_CreateArray(); //创建一个数组
if (!pRoot)
return;
for (int i = 1; i < 5; i++)
cJSON_AddNumberToObject(pRoot, "cls", i);
char* szJson = cJSON_Print(pRoot);
if (!szJson)
return;
printf("%s\n", szJson);
free(szJson);
cJSON_Delete(pRoot);
}
/*
数组的成员为对象
[
{"number": "00001", "name":"zhang3"},
{"number": "00002", "name":"li4"},
{"number": "00003", "name":"wang5"},
{"number": "00004", "name":"zhao6"}
]
*/
void test03()
{
cJSON* pRoot = cJSON_CreateArray();
if (!pRoot)
return;
char* szNumArray[] = {"0001", "0002", "0003", "0004"};
char* szNameArray[] = {"zhang3", "li4", "wang5", "zhao6"};
for (int i = 0; i < __crt_countof(szNumArray); i++)
{
cJSON* pItem = cJSON_CreateObject(); //子结构体
cJSON_AddStringToObject(pItem, "number", szNumArray[i]);
cJSON_AddStringToObject(pItem, "name", szNameArray[i]);
cJSON_AddItemToObject(pRoot, "", pItem);
}
char* szJson = cJSON_Print(pRoot);
if (!szJson)
return;
printf("%s\n", szJson);
free(szJson);
cJSON_Delete(pRoot);
}
/*
{
"class" : "10000",
"student": [
{
"number":"0001",
"name": "zhang3"
},
{
"number":"0002",
"name": "li4"
},
{
"number": "0003",
"name": "wang5"
},
{
"number": "0004",
"name": "zhao6"
}
]
}
*/
void test04()
{
cJSON* pRoot = cJSON_CreateObject();
if (!pRoot)
return;
cJSON_AddStringToObject(pRoot, "class", "10000");
cJSON* pSubRoot = cJSON_CreateArray();
if (!pSubRoot)
{
cJSON_Delete(pRoot);
return;
}
char* szNumArray[] = { "0001", "0002", "0003", "0004" };
char* szNameArray[] = { "zhang3", "li4", "wang5", "zhao6" };
for (int i = 0; i < __crt_countof(szNumArray); i++)
{
cJSON* pItem = cJSON_CreateObject(); //子结构体
cJSON_AddStringToObject(pItem, "number", szNumArray[i]);
cJSON_AddStringToObject(pItem, "name", szNameArray[i]);
cJSON_AddItemToArray(pSubRoot, pItem);
}
cJSON_AddItemToObject(pRoot, "student", pSubRoot);
char* szJson = cJSON_Print(pRoot);
if (!szJson)
return;
printf("%s\n", szJson);
free(szJson);
cJSON_Delete(pRoot);
}
/*
解析json
*/
cJSON* create()
{
cJSON* pRoot = cJSON_CreateObject();
if (!pRoot)
return NULL;
cJSON_AddStringToObject(pRoot, "class", "10000");
cJSON* pSubRoot = cJSON_CreateArray();
if (!pSubRoot)
{
cJSON_Delete(pRoot);
return NULL;
}
char* szNumArray[] = { "0001", "0002", "0003", "0004" };
char* szNameArray[] = { "zhang3", "li4", "wang5", "zhao6" };
for (int i = 0; i < __crt_countof(szNumArray); i++)
{
cJSON* pItem = cJSON_CreateObject(); //子结构体
cJSON_AddStringToObject(pItem, "number", szNumArray[i]);
cJSON_AddStringToObject(pItem, "name", szNameArray[i]);
cJSON_AddItemToArray(pSubRoot, pItem);
}
cJSON_AddItemToObject(pRoot, "student", pSubRoot);
char* szJson = cJSON_Print(pRoot);
if (!szJson)
return NULL;
printf("%s\n", szJson);
return pRoot;
}
void parse(cJSON* root)
{
if (!root)
return;
cJSON* pClass = cJSON_GetObjectItem(root, "class"); //获取对象
printf("class = %s\n", pClass->valuestring);
cJSON* pArray = cJSON_GetObjectItem(root, "student");
int nCount = cJSON_GetArraySize(pArray);
for (int i = 0; i < nCount; i++)
{
cJSON* pStudent = cJSON_GetArrayItem(pArray, i);
cJSON* pNum = cJSON_GetObjectItem(pStudent, "number");
cJSON* pName = cJSON_GetObjectItem(pStudent, "name");
printf("number=%s, name=%s\n", pNum->valuestring, pName->valuestring);
}
}
void test05()
{
cJSON* p = create();
parse(p);
cJSON_Delete(p);
}
int main()
{
test05();
return 0;
}