zoukankan      html  css  js  c++  java
  • 通过YAJL生成json语句

    这里主要介绍的是怎样通过yajl生成一个json语句。方法通过代码就能够非常清楚的看到了,只是这里仅仅加入了字符串。

    假设须要加入其它类型的,能够查考yajl的手冊,调用其它函数进行加入。


    /*
     * 这个文件主要展示怎样通过yajl生成json语句。
     * 这里不包括解析的部分,仅仅包括了最简单的构造部分。
     */
    
    #include <yajl/yajl_gen.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    //#define USE_MAP 1
    #define BEAUTIFY_OUTPUT 1
    
    typedef struct yajl_info_t
    {
        int depth;
        yajl_gen gen; //保存一个generator
    } yajl_info;
    
    
    /*
     * begin_map和end_map会生成一个对象
     * 在它们直接插入数据的话,会变成对象中的键/值对
     */
    yajl_gen_status begin_map(void *ctx)
    {
        yajl_info *info = (yajl_info *)ctx;
        yajl_gen_status __stat = yajl_gen_map_open(info->gen);
        if (__stat == yajl_gen_status_ok)  {
            info->depth++ ;
        } else {
            printf("yajl_gen_map_open failed
    ");
        }
        return __stat;
    }
    
    /*
     * begin_map和end_map会生成一个数组
     * 在它们直接插入数据的话,会变成数组中的内存
     */
    yajl_gen_status begin_array(void *ctx)
    {
        yajl_info *info = (yajl_info *)ctx;
        yajl_gen_status __stat = yajl_gen_array_open(info->gen);
        if (__stat == yajl_gen_status_ok)  {
            info->depth++;
        } else {
            printf("yajl_gen_array_open failed
    ");
        }
        return __stat;
    }
    
    yajl_gen_status end_array(void *ctx)
    {
        yajl_info *info = (yajl_info *)ctx;
        yajl_gen_status __stat = yajl_gen_array_close(info->gen);
        if (__stat == yajl_gen_status_ok) {
            info->depth--;
        }
        return __stat;
    }
    
    int yajl_init(yajl_info *info) {
        info->depth = 0;
        info->gen = yajl_gen_alloc(NULL);
    #ifdef BEAUTIFY_OUTPUT
        //设置输出格式
        yajl_gen_config(info->gen, yajl_gen_beautify, 1);
    #endif
    }
    
    int yajl_free(yajl_info *info) {
        info->depth = 0;
        yajl_gen_free(info->gen);
    }
    
    int main(int argc, char **argv)
    {
        yajl_info yajlinfo;
        yajl_init (&yajlinfo);
        const unsigned char* buf;
        size_t buflen;
        int i;
    
    #ifdef USE_MAP
        //创建一个对象
        begin_map(&yajlinfo);
    #else
        //创建一个数组
        begin_array(&yajlinfo);
    #endif
    
        //往对象/数组中插入数据
        unsigned char *key = "scutech";
        unsigned char *value = "dingjia";
        int keylen = strlen(key);
        int valuelen = strlen(value);
        yajl_gen_string(yajlinfo.gen, (const unsigned char*)key, keylen);
        yajl_gen_string(yajlinfo.gen, (const unsigned char*)value, valuelen);
    
        for(i=1;i<5;i++) {
            unsigned char key1[50];
            unsigned char value1[50];
            sprintf(key1, "scutech%d", i);
            sprintf(value1, "dingjia%d", i);
            int keylen1 = strlen(key1);
            int valuelen1 = strlen(value1);
            //往对象中插入数据
            begin_map(&yajlinfo);
            yajl_gen_string(yajlinfo.gen, (const unsigned char*)key1, keylen1);
            yajl_gen_string(yajlinfo.gen, (const unsigned char*)value1, valuelen1);
            end_map(&yajlinfo);
        }
    
    #ifdef USE_MAP
        end_map(&yajlinfo);
    #else
        end_array(&yajlinfo);
    #endif
        //这里是获取已经生成好的json语句,保存在buf中,长度保存在buflen中
        yajl_gen_get_buf(yajlinfo.gen, &buf, &buflen);
        printf("%s
    ", buf);
        yajl_free(&yajlinfo);
        return 0;
    

  • 相关阅读:
    4、提取看似无用的委托变量,减少构造开销
    Cloud Foundry buildpack
    mysql中engine=innodb和engine=myisam的区别
    Maven中dependencyManagement的作用
    bean
    servlet
    web服务器 应用服务器区别 web框架
    Java和Python的Web开发
    spring mvc controller 高并发问题
    es 批量添加数据
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4245976.html
Copyright © 2011-2022 走看看