cJSON使用

结合网上cJSON的一些资料,博客,略微方便入门一些。

先看json的数据结构 c中没有对象,所以json数据是采用链表存储的 
  1. typedef struct cJSON {  
  2.     struct cJSON *next,*prev;   // 数组 对象数据中用到  
  3.     struct cJSON *child;        // 数组 和对象中指向子数组对象或值  
  4.   
  5.     int type;           // 元素的类型,如是对象还是数组  
  6.   
  7.     char *valuestring;          // 如果是字符串  
  8.     int valueint;               // 如果是数值  
  9.     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数据 
[javascript] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. {  
  2.     "name""Jack (\"Bee\") Nimble",   
  3.     "format": {  
  4.         "type":       "rect",   
  5.         "width":      1920,   
  6.         "height":     1080,   
  7.         "interlace":  false,   
  8.         "frame rate": 24  
  9.     }  
  10. }  

1:讲字符串解析成json结构体。 

C代码  收藏代码
  1. cJSON *root = cJSON_Parse(my_json_string);  

2:获取某个元素 
C代码  收藏代码
  1. cJSON *format = cJSON_GetObjectItem(root,"format");  
  2. int framerate = cJSON_GetObjectItem(format,"frame rate")->valueint;  

3:讲json结构体转换成字符串 
C代码  收藏代码
  1. char *rendered=cJSON_Print(root);  

4:删除 
C代码  收藏代码
  1. cJSON_Delete(root);  

5:构建一个json结构体 
C代码  收藏代码
  1. cJSON *root,*fmt;  
  2. root=cJSON_CreateObject();    
  3. cJSON_AddItemToObject(root, "name", cJSON_CreateString("Jack (\"Bee\") Nimble"));  
  4. cJSON_AddItemToObject(root, "format", fmt=cJSON_CreateObject());  
  5. cJSON_AddStringToObject(fmt,"type",     "rect");  
  6. cJSON_AddNumberToObject(fmt,"width",        1920);  
  7. cJSON_AddNumberToObject(fmt,"height",       1080);  
  8. cJSON_AddFalseToObject (fmt,"interlace");  
  9. cJSON_AddNumberToObject(fmt,"frame rate",   24);  

6:创建如下

root:[{"name":"aaa","num":14},{"type":"int",id:123},{...}]

json是键值对,一个键对应一个值,这里的root对应的是一个数组,这里数组成员是对象,也可以是其它的。但是注意这里的数组的成员可以不同。


1) cJSON *root,*array;//声明对象
2)array=cJSON_CreateArray();//创建cJSON数组
3)root=cJSON_CreateObject();//创建cJSON对象
4)cJSON_AddItemToObject(root,"name",cJSON_CreateString("aaa"));
5)cJSON_AddItemToObject(root,"no",cJSON_CreateNumber(1));
6)cJSON_AddItemToArray(array,root);
重复3-6步,往对象中加数据可以不同,将往数组添加多条记录


7.下面把转来的代码贴上。

/*******************************************

*先C转成JSON的字符串,然后再把这个JSON的字符串转回来。

*******************************************/

#include "stdio.h"

#include "cjson.h"

/*******************************


int main_()

{

  //首先是用C转换成JSON
    char *out ;
    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是可以嵌套的
    cJSON_AddNumberToObject(fmt,"width",        1920);
    cJSON_AddNumberToObject(fmt,"height",       1080);
    cJSON_AddNumberToObject(fmt,"frame rate",   24);

    out=cJSON_Print(fmt);
    printf("%s\n",out);//此时out指向的字符串就是JSON格式的了
    free(out);//释放空间

  //接下来进行JSON格式向回转换

  cJSON *fmt = NULL,*JSONroot = NULL;

  num = cJSON_GetArraySize(JSONroot);//看看有多少个项目

  fmt = cJSON_GetObjectItem(JSONroot,"name");

  char name[256];

  snprintf(name,256,"%s",fmt->valuestring);//把fmt指向的JSON节点的字符串复制到name数组里来。

                        //JSON是采用链式存储的,就是链表存储。具体的结构体可以在"cjson.h"里面找到

  /* The cJSON structure: */
//typedef struct cJSON {
//    struct cJSON *next,*prev;    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
//    struct cJSON *child;        /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */

//    int type;                    /* The type of the item, as above. */

//    char *valuestring;            /* The item's string, if type==cJSON_String */
//   int valueint;                /* The item's number, if type==cJSON_Number */
//    double valuedouble;            /* The item's number, if type==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;

  cJSON *child;

  fmt = cJSON_GetObjectItem(JSONroot,"format");

  child = cJSON_GetObjectItem(fmt,"type");

  char type[256];

  snprintf(type,256,"%s",child->valuestring);

  child = cJSON_GetObjectItem(fmt,"width");

  int width = child->valueint;

  child = cJSON_GetObjectItem(fmt,"height");

  int heigh = child->valueint;

  child = cJSON_GetObjectItem(fmt,"frame rate");

  int frame = child->valueint;

    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值