C语言 JSON 解析库 - MJSON使用介绍

来源:互联网 发布:idea 新建java类 编辑:程序博客网 时间:2024/06/15 00:05

下载地址:
http://www.linuxpig.com/softwares/mjson/mjson-0.9.tar.bz2

 

安装:
解压出来,然后直接包含 json.h 就可以了。

下面是几个官方给出的几个例子,由于直接拷贝过来编译没通过,做了一些修改,详见注释部分。

【mjson例一】

01<strong>#include <stdio.h>
02#include <stdlib.h>
03#include <locale.h>
04 
05#include "json.h"
06 
07int main (void)
08{
09    char *text;
10    json_t *root, *entry, *label, *value;
11    setlocale (LC_ALL,"");//设为系统默认地域信息
12 
13    // creates the root node
14    root = json_new_object();
15    // create an entry node
16    entry = json_new_object();
17 
18//    第一部分,打印结果:
19//    {"entry":{"name":"Andew","phone":"555 123 456"}}
20 
21    // insert the first label-value pair
22    label = json_new_string("name");
23    value = json_new_string("Andew");
24    json_insert_child(label, value);
25    json_insert_child(entry, label);
26 
27    // insert the second label-value pair
28    label = json_new_string("phone");
29    value = json_new_string("555 123 456");
30    json_insert_child(label, value);
31    json_insert_child(entry, label);
32 
33    // inserts that object as a value in a label-value pair
34    label = json_new_string("entry");
35    json_insert_child(label, entry);
36 
37    // inserts that label-value pair into the root object
38    json_insert_child(root, label);
39 
40    // print the result
41    json_tree_to_string(root, &text);
42    printf("%s\n",text);
43 
44    // clean up
45    free(text);
46    json_free_value(&root);
47 
48//打印第二部分,数组示例,
49//结果:
50//    ["test1","test2",109]
51 
52        root = json_new_array();
53        label = json_new_string("test1");
54        json_insert_child(root,label);
55        value = json_new_string("test2");
56        json_insert_child(root,value);
57        value = json_new_number("109");
58        json_insert_child(root,value);
59 
60        json_tree_to_string(root,&text);
61        printf("%s\n",text);
62 
63        // clean up
64        free(text);
65        json_free_value(&root);
66 
67    return EXIT_SUCCESS;
68}</strong>
【mjson例二】
01#include <stdio.h>
02#include <stdlib.h>
03#include <locale.h>
04 
05#include "json.h"
06 
07json_t *new_entry(char *name,char *phone)
08{
09    json_t *entry, *label, *value;
10 
11    // create an entry node
12    entry = json_new_object();
13     
14    // insert the first label-value pair
15    label = json_new_string("name");
16    value = json_new_string("Andew");
17    json_insert_child(label, value);
18    json_insert_child(entry, label);
19     
20    // insert the second label-value pair
21    label = json_new_string("phone");
22    value = json_new_string("555 123 456");
23    json_insert_child(label, value);
24    json_insert_child(entry, label);
25 
26    // inserts that object as a value in a label-value pair
27    label = json_new_string("entry");
28    json_insert_child(label, entry);
29 
30    return label;
31}
32 
33int main (void)
34{
35    setlocale (LC_ALL,"");//设置为系统默认的地域信息
36 
37    json_t *root, *subtree;
38 
39    // creates the root node
40    root = json_new_object();
41 
42    // creates the desired MJSON document subtree
43    subtree = new_entry("Andrew","555 123 456");
44 
45    // inserts the subtree into the root object
46    json_insert_child(root, subtree);
47 
48    // print the result
49    char *text;
50    json_tree_to_string(root, &text);
51    printf("%s\n",text);   //官方例子中为printf("%ls\n",text);去掉l才能打印出来。。
52 
53    // clean up
54    free(text);
55    json_free_value(&root);
56    return EXIT_SUCCESS;
57}
58 
59【输出结果】
60{"entry":{"name":"Andew","phone":"555 123 456"}}
【mjson例三】
01#include <stdio.h>
02#include <stdlib.h>
03#include <locale.h>
04 
05#include "json.h"
06 
07int main (void)
08{
09    setlocale (LC_ALL,"");
10    char *document = "{\"entry\":{\"name\":\"Andew\",\"phone\":\"555 123 456\"}}";
11 
12    json_t *root;
13 
14    printf("Parsing the document…\n");
15    root = json_parse_document(document);
16 
17    printf("Printing the document tree…\n");
18    json_tree_to_string(root, &document);
19    wprintf("%ls\n", document);
20 
21    // clean up
22    json_free_value(&root);
23    return EXIT_SUCCESS;
24}

【参考】

http://www.json.org/json-zh.html

http://mjson.sourceforge.net/


我使用的是cJSONcJSONFiles

先看json的数据结构
c中没有对象,所以json数据是采用链表存储的

view sourceprint?
01.typedef struct cJSON {
02.struct cJSON *next,*prev;    // 数组 对象数据中用到
03.struct cJSON *child;        // 数组 和对象中指向子数组对象或值
04. 
05.int type;            // 元素的类型,如是对象还是数组
06. 
07.char *valuestring;            // 如果是字符串
08.int valueint;                // 如果是数值
09.double valuedouble;            // 如果类型是cJSON_Number
10. 
11.char *string;                // The item's name string, if this item is the child of, or is in the list of subitems of an object.
12.} cJSON;

比如你有一个json数据

view sourceprint?
01.{
02."name""Jack (\"Bee\") Nimble",
03."format": {
04."type":       "rect",
05."width":      1920,
06."height":     1080,
07."interlace":  false,
08."frame rate"24
09.}
10.}

那么你可以

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结构体

view sourceprint?
01.cJSON *root,*fmt;
02.root=cJSON_CreateObject();
03.cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));
04.cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());
05.cJSON_AddStringToObject(fmt,"type",        "rect");
06.cJSON_AddNumberToObject(fmt,"width",        1920);
07.cJSON_AddNumberToObject(fmt,"height",        1080);
08.cJSON_AddFalseToObject (fmt,"interlace");
09.cJSON_AddNumberToObject(fmt,"frame rate",    24);

原创粉丝点击