转载:https://github.com/DaveGamble/cJSON
cJSON的使用:
把这两个文件放到自己的工程
实例:
建立和解析这个json格式的字符串
{
"name": "Awesome 4K",
"resolutions": [
{
"width": 1280,
"height": 720
},
{
"width": 1920,
"height": 1080
},
{
"width": 3840,
"height": 2160
}
]
}
1 #include<iostream> 2 #include"cJSON.h" 3 4 using namespace std; 5 6 //create a monitor with a list of supported resolutions 7 //NOTE: Returns a heap allocated string, you are required to free it after use. 8 char *create_monitor(void) 9 { 10 const unsigned int resolution_numbers[3][2] = { 11 {1280, 720}, 12 {1920, 1080}, 13 {3840, 2160} 14 }; 15 char *string = NULL; 16 cJSON *name = NULL; 17 cJSON *resolutions = NULL; 18 cJSON *resolution = NULL; 19 cJSON *width = NULL; 20 cJSON *height = NULL; 21 size_t index = 0; 22 23 cJSON *monitor = cJSON_CreateObject(); 24 if (monitor == NULL) 25 { 26 goto end; 27 } 28 29 name = cJSON_CreateString("Awesome 4K"); 30 if (name == NULL) 31 { 32 goto end; 33 } 34 /* after creation was successful, immediately add it to the monitor, 35 * thereby transferring ownership of the pointer to it */ 36 cJSON_AddItemToObject(monitor, "name", name); 37 38 resolutions = cJSON_CreateArray(); 39 if (resolutions == NULL) 40 { 41 goto end; 42 } 43 cJSON_AddItemToObject(monitor, "resolutions", resolutions); 44 45 for (index = 0; index < (sizeof(resolution_numbers) / (2 * sizeof(int))); ++index) 46 { 47 resolution = cJSON_CreateObject(); 48 if (resolution == NULL) 49 { 50 goto end; 51 } 52 cJSON_AddItemToArray(resolutions, resolution); 53 54 width = cJSON_CreateNumber(resolution_numbers[index][0]); 55 if (width == NULL) 56 { 57 goto end; 58 } 59 cJSON_AddItemToObject(resolution, "width", width); 60 61 height = cJSON_CreateNumber(resolution_numbers[index][1]); 62 if (height == NULL) 63 { 64 goto end; 65 } 66 cJSON_AddItemToObject(resolution, "height", height); 67 } 68 69 string = cJSON_Print(monitor); 70 if (string == NULL) 71 { 72 fprintf(stderr, "Failed to print monitor. "); 73 } 74 75 end: 76 cJSON_Delete(monitor); 77 return string; 78 } 79 80 /* return 1 if the monitor supports full hd, 0 otherwise */ 81 int supports_full_hd(const char * const monitor) 82 { 83 const cJSON *resolution = NULL; 84 const cJSON *resolutions = NULL; 85 const cJSON *name = NULL; 86 int status = 0; 87 cJSON *monitor_json = cJSON_Parse(monitor); 88 if (monitor_json == NULL) 89 { 90 const char *error_ptr = cJSON_GetErrorPtr(); 91 if (error_ptr != NULL) 92 { 93 fprintf(stderr, "Error before: %s ", error_ptr); 94 } 95 status = 0; 96 goto end; 97 } 98 99 name = cJSON_GetObjectItemCaseSensitive(monitor_json, "name"); 100 if (cJSON_IsString(name) && (name->valuestring != NULL)) 101 { 102 printf("Checking monitor "%s" ", name->valuestring); 103 } 104 105 resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions"); 106 cJSON_ArrayForEach(resolution, resolutions) 107 { 108 cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width"); 109 cJSON *height = cJSON_GetObjectItemCaseSensitive(resolution, "height"); 110 111 if (!cJSON_IsNumber(width) || !cJSON_IsNumber(height)) 112 { 113 status = 0; 114 goto end; 115 } 116 117 int w = width->valueint; 118 int h = height->valueint; 119 cout << "(w h) (" << w << " " << h << ") "; 120 121 if ((width->valuedouble == 1920) && (height->valuedouble == 1080)) 122 { 123 status = 1; 124 goto end; 125 } 126 } 127 128 end: 129 cJSON_Delete(monitor_json); 130 return status; 131 } 132 133 int main() 134 { 135 char *strJson = create_monitor(); 136 cout << strJson << " "; 137 supports_full_hd(strJson); 138 free(strJson); 139 system("pause"); 140 return 0; 141 }
另一个json库:jsoncpp github地址:https://github.com/open-source-parsers/jsoncpp