关闭

JSON简介及具体的JSON消息示例

1944人阅读 评论(4) 收藏 举报
分类:

在互联网软件前端与后台进行消息交互的过程中,需要有一种标准的数据交换格式供前后端采用。在众多的数据交换格式中,JSON(JavaScript Object Notation,JS 对象标记)是应用得比较广泛的,它采用完全独立于编程语言的文本格式来存储和表示数据。JSON的层次结构简洁、清晰,易于阅读和编写,同时也易于机器解析和生成,这有效地提升了网络传输效率。

本文首先对JSON进行简单的介绍,然后用具体的C代码示范了各类JSON消息的构造方法。

JSON简介
JSON 的语法规则可以用下面的四句话来概括:
第一,对象表示为键值对。
第二,数据由逗号分隔。
第三,花括号保存对象。
第四,方括号保存数组。

具体而言,每条JSON消息都是包裹在大括号之内的,键值对组合中的键名写在前面并用双引号包裹,键和值使用冒号分隔,冒号后面紧接着值,如:”name”: “zhou”;数组是用方括号包裹起来的,如:[“zhou”, “zhang”]。

JSON消息示例
本部分用实际的C代码来示范了各类常用的JSON消息的构造方法。在编写代码之前,要到https://sourceforge.net/projects/cjson/上去下载C语言版的JSON封装API。

在JSON的API中,我们常用到的有如下几个函数:

1)cJSON_CreateObject():创建JSON对象。
2)cJSON_Delete(cJSON *c):删除一个JSON结构。
3)cJSON_AddStringToObject(object,name,s):将一个字符串添加到对象中。
4)cJSON_AddNumberToObject(object,name,n):将一个整数添加到对象中。
5)cJSON_Print(cJSON *item):将JSON消息以文本消息的样式输出。
6)cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item):将一个数据(通常为对象)添加到一个对象中。
7)cJSON_CreateString(const char *string):生成字符串数据。
8)cJSON_AddItemToArray(cJSON *array, cJSON *item):将一个数据添加到一个数组中。
9)cJSON_CreateArray():创建JSON数组。

下面,我们开始编写C代码来生成JSON消息。
1.如果要实现如下JSON消息:

{
    name:"zhou",
    age:30
}

则编写C代码函数如下:

int MakeJsonNameAge(char *pszJsonContent, int iJsonLen)
{
    cJSON *root = NULL;
    char  *out  = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonNameAge: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if(NULL == root)
    {
        printf("MakeJsonNameAge: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    cJSON_AddStringToObject(root, "name", "zhou");

    cJSON_AddNumberToObject(root, "age", 30);

    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

2.如果要实现如下JSON消息:

{
    personinfo:{
        name:"zhou",
        age:30
    }
}

则编写C代码函数如下:

int MakeJsonPersonInfo(char *pszJsonContent, int iJsonLen)
{
    cJSON *root        = NULL;
    cJSON *JsonLevel1  = NULL;
    char  *out         = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonPersonInfo: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if(NULL == root)
    {
        printf("MakeJsonPersonInfo: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    JsonLevel1 = cJSON_CreateObject();
    if(NULL == JsonLevel1)
    {
        printf("MakeJsonPersonInfo: exec cJSON_CreateObject to get JsonLevel1 failed!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddStringToObject(JsonLevel1, "name", "zhou");

    cJSON_AddNumberToObject(JsonLevel1, "age", 30);

    cJSON_AddItemToObject(root, "personinfo", JsonLevel1);

    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

3.如果要实现如下JSON消息:

{
    personinfo1:{
        name:"zhou",
        age:30
    },
    personinfo2:{
        name:"zhang",
        age:41
    }
}

则编写C代码函数如下:

int MakeJsonTwoPersonInfo(char *pszJsonContent, int iJsonLen)
{
    cJSON *root        = NULL;
    cJSON *JsonLevel1  = NULL;
    char  *out         = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonTwoPersonInfo: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if(NULL == root)
    {
        printf("MakeJsonTwoPersonInfo: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    //---------------
    JsonLevel1 = cJSON_CreateObject();
    if(NULL == JsonLevel1)
    {
        printf("MakeJsonTwoPersonInfo: exec cJSON_CreateObject to get JsonLevel1 failed 1!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddStringToObject(JsonLevel1, "name", "zhou");

    cJSON_AddNumberToObject(JsonLevel1, "age", 30);

    cJSON_AddItemToObject(root, "personinfo1", JsonLevel1);

    //---------------
    JsonLevel1 = cJSON_CreateObject();
    if(NULL == JsonLevel1)
    {
        printf("MakeJsonTwoPersonInfo: exec cJSON_CreateObject to get JsonLevel1 failed 2!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddStringToObject(JsonLevel1, "name", "zhang");

    cJSON_AddNumberToObject(JsonLevel1, "age", 40);

    cJSON_AddItemToObject(root, "personinfo2", JsonLevel1);

    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

4.如果要实现如下JSON消息:

{
    id:"123456",
    personinfo:{
        name:"zhou",
        age:30
    }
}

则编写C代码函数如下:

int MakeJsonIDPersonInfo(char *pszJsonContent, int iJsonLen)
{
    cJSON *root        = NULL;
    cJSON *JsonLevel1  = NULL;
    char  *out         = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonIDPersonInfo: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if(NULL == root)
    {
        printf("MakeJsonIDPersonInfo: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    cJSON_AddStringToObject(root, "id", "123456");

    JsonLevel1 = cJSON_CreateObject();
    if(NULL == JsonLevel1)
    {
        printf("MakeJsonIDPersonInfo: exec cJSON_CreateObject to get JsonLevel1 failed!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddStringToObject(JsonLevel1, "name", "zhou");

    cJSON_AddNumberToObject(JsonLevel1, "age", 30);

    cJSON_AddItemToObject(root, "personinfo", JsonLevel1);

    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

5.如果要实现如下JSON消息:

{
    personname:[
        "zhou",
        "zhang"
    ]
}

则编写C代码函数如下:

int MakeJsonPersonNameInfo(char *pszJsonContent, int iJsonLen)
{
    cJSON *root        = NULL;
    cJSON *JsonLevel1  = NULL;
    cJSON *JsonLevel2  = NULL;
    char  *out         = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonPersonNameInfo: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if (NULL == root)
    {
        printf("MakeJsonPersonNameInfo: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    JsonLevel1 = cJSON_CreateArray();
    if (NULL == JsonLevel1)
    {
        printf("MakeJsonPersonNameInfo: exec cJSON_CreateArray to get JsonLevel1 failed!");

        cJSON_Delete(root);
        return -1;
    }

    cJSON_AddItemToObject(root, "personname", JsonLevel1);

    JsonLevel2 = cJSON_CreateString("zhou");
    cJSON_AddItemToArray(JsonLevel1, JsonLevel2);

    JsonLevel2 = cJSON_CreateString("zhang");
    cJSON_AddItemToArray(JsonLevel1, JsonLevel2);

    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

6.如果要实现如下JSON消息:

{
    id:"123456",
    personname:[
        "zhou",
        "zhang"
    ],
    personinfo:{
        phonenumber:"15696192591",
        age:30
    }
}

则编写C代码函数如下:

int MakeJsonIDPersonNameInfo(char *pszJsonContent, int iJsonLen)
{
    cJSON *root        = NULL;
    cJSON *JsonLevel1  = NULL;
    cJSON *JsonLevel2  = NULL;
    char  *out         = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonIDPersonNameInfo: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if (NULL == root)
    {
        printf("MakeJsonIDPersonNameInfo: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    cJSON_AddStringToObject(root, "id", "123456");

    JsonLevel1 = cJSON_CreateArray();
    if (NULL == JsonLevel1)
    {
        printf("MakeJsonIDPersonNameInfo: exec cJSON_CreateArray to get JsonLevel1 failed 1!");

        cJSON_Delete(root);
        return -1;
    }

    cJSON_AddItemToObject(root, "personname", JsonLevel1);

    JsonLevel2 = cJSON_CreateString("zhou");
    cJSON_AddItemToArray(JsonLevel1, JsonLevel2);

    JsonLevel2 = cJSON_CreateString("zhang");
    cJSON_AddItemToArray(JsonLevel1, JsonLevel2);

    //-----------------
    JsonLevel1 = cJSON_CreateObject();
    if(NULL == JsonLevel1)
    {
        printf("MakeJsonIDPersonNameInfo: exec cJSON_CreateObject to get JsonLevel1 failed 2!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddStringToObject(JsonLevel1, "name", "zhou");

    cJSON_AddNumberToObject(JsonLevel1, "age", 30);

    cJSON_AddItemToObject(root, "personinfo", JsonLevel1);

    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

7.如果要实现如下JSON消息:

{
    personinfo:{
        personname:[
        "zhou",
        "zhang"
        ],
        age:30
    }
}

则编写C代码函数如下:

int MakeJsonAgePersonNameInfo(char *pszJsonContent, int iJsonLen)
{
    cJSON *root        = NULL;
    cJSON *JsonLevel1  = NULL;
    cJSON *JsonLevel2  = NULL;
    cJSON *JsonLevel3  = NULL;
    char  *out         = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonAgePersonNameInfo: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if (NULL == root)
    {
        printf("MakeJsonAgePersonNameInfo: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    JsonLevel1 = cJSON_CreateObject();
    if(NULL == JsonLevel1)
    {
        printf("MakeJsonAgePersonNameInfo: exec cJSON_CreateObject to get JsonLevel1 failed!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddItemToObject(root, "personinfo", JsonLevel1);

    //------------------
    JsonLevel2 = cJSON_CreateArray();
    if (NULL == JsonLevel2)
    {
        printf("MakeJsonAgePersonNameInfo: exec cJSON_CreateArray to get JsonLevel2 failed!");

        cJSON_Delete(root);
        return -1;
    }

    cJSON_AddItemToObject(JsonLevel1, "personname", JsonLevel2);

    JsonLevel3 = cJSON_CreateString("zhou");
    cJSON_AddItemToArray(JsonLevel2, JsonLevel3);

    JsonLevel3 = cJSON_CreateString("zhang");
    cJSON_AddItemToArray(JsonLevel2, JsonLevel3);

    //------------------
    cJSON_AddNumberToObject(JsonLevel1, "age", 30);


    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

8.如果要实现如下JSON消息:

{
    personinfo:[
    {
        name:"zhou",
        age:30
    },
    {
        name:"zhang",
        age:41
    }
    ]
}

则编写C代码函数如下:

int MakeJsonPersonsInfo(char *pszJsonContent, int iJsonLen)
{
    cJSON *root        = NULL;
    cJSON *JsonLevel1  = NULL;
    cJSON *JsonLevel2  = NULL;
    char  *out         = NULL;

    // 判断函数参数是否合法
    if (pszJsonContent == NULL)
    {
        printf("MakeJsonPersonsInfo: pszJsonContent is NULL!");

        return -1;
    }

    root = cJSON_CreateObject();
    if (NULL == root)
    {
        printf("MakeJsonPersonsInfo: exec cJSON_CreateObject to get root failed!");

        return -1;
    }

    JsonLevel1 = cJSON_CreateArray();
    if (NULL == JsonLevel1)
    {
        printf("MakeJsonPersonsInfo: exec cJSON_CreateArray to get JsonLevel1 failed!");

        cJSON_Delete(root);
        return -1;
    }

    cJSON_AddItemToObject(root, "personinfo", JsonLevel1);

    //---------------
    JsonLevel2 = cJSON_CreateObject();
    if(NULL == JsonLevel2)
    {
        printf("MakeJsonPersonsInfo: exec cJSON_CreateObject to get JsonLevel2 failed 1!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddItemToArray(JsonLevel1, JsonLevel2);

    cJSON_AddStringToObject(JsonLevel2, "name", "zhou");

    cJSON_AddNumberToObject(JsonLevel2, "age", 30);

    //---------------
    JsonLevel2 = cJSON_CreateObject();
    if(NULL == JsonLevel2)
    {
        printf("MakeJsonPersonsInfo: exec cJSON_CreateObject to get JsonLevel2 failed 2!");

        cJSON_Delete(root);
        return -1;
    }   

    cJSON_AddItemToArray(JsonLevel1, JsonLevel2);

    cJSON_AddStringToObject(JsonLevel2, "name", "zhang");

    cJSON_AddNumberToObject(JsonLevel2, "age", 41);     

    //---------------
    out=cJSON_Print(root);
    strncpy(pszJsonContent, out, iJsonLen - 1);
    pszJsonContent[iJsonLen - 1] = '\0';

    cJSON_Delete(root);
    free(out);

    return 0;
}

总结
以上是常见JSON消息的C代码实现方法,大家可以编写测试代码来看最终生成的JSON消息是否是我们描述的那样。我编写了一个完整的测试代码,放到了GitHub上,欢迎下载阅读:https://github.com/zhouzxi/TestJson。(本测试程序是运行在Linux上的,大家可以使用这个命令进行编译:gcc -g -o TestJson TestJson.c cJSON.c -pthread -lc -lm)

2
0
查看评论

json 简单示例

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Editi...
  • yi_xiangd
  • yi_xiangd
  • 2017-01-18 17:52
  • 2003

JSON入门小例子

JSON入门  什么是JSON              JSON(JavaScript Object Notation http://www....
  • yang_best
  • yang_best
  • 2014-10-29 16:17
  • 11703

最简单的json实例

 官方www.json.org           var my_json={FBI:[{name:"rose",age:"25"},{name:&q...
  • longronglin
  • longronglin
  • 2009-08-02 22:14
  • 37646

JSON简介与小例子

一 简介: JSON(JavaScript Object Notation)JavaScript 对象表示法,是一种轻量级的数据交换格式。这是很容易为人类所读取和写入。这是易于机器解析和生成。它是基于JavaScript编程语言的一个子集 , 标准ECMA-262第三版- 1999年...
  • Dr_Guo
  • Dr_Guo
  • 2016-02-01 13:03
  • 1393

json的操作应用实例

在自己做的商品收银页面中,反思这个页面的做法,觉得有必要做个笔记。      先来个系统截图:   简短的说明一下开单消费的业务流程:   1.页面加载成功后,出现左下角的datagrid,显示商品信息。   2.选择商品,可以多次多选,点...
  • w2765006513
  • w2765006513
  • 2016-07-24 12:19
  • 571

JS操作json简单示例

什么是JSON json(JavaScript Object Notation)是一种轻量级的数据交换格式,可以把它看成跟xml是完全同一类东东,只不过用的另外一套格式规范。 json的结构就两种: 对象和数组 (1)对象 用中括号括起来的一组键值对,{key:value,key:value,......
  • weiwenhp
  • weiwenhp
  • 2016-01-15 14:59
  • 1549

JSON格式数据示例操作

json示例数据: { "test1": "wx9fdb8ble7ce3c68f", "test2": "123456789", "tes...
  • chenz_yang
  • chenz_yang
  • 2017-07-21 18:01
  • 3131

简单的org.json实例

package json; import java.util.HashMap; import java.util.Map; import org.json.JSONException; import org.json.JSONObject; public class JsonObjectSam...
  • csdnhxs
  • csdnhxs
  • 2016-10-20 13:59
  • 681

Json介绍及其优缺点

Json介绍 我们知道AJAX技术能够使得每一次请求更加迅捷,对于每一次请求返回的不是整个页面,也仅仅是所需要返回的数据。通常AJAX通过返回XML格式的数据,然后再通过客户端复杂的JavaScript脚本解析和渲染这些XML格式的数据。 JSON(读Jason)是为了能够使得数据格式成为一种标...
  • ssisse
  • ssisse
  • 2016-06-01 13:23
  • 2745

JSON技术介绍

XML——这种用于表示客户端与服务器间数据交换有效负载的格式,几乎已经成了Web services的同义词。我们知道AJAX技术能够使得每一次请求更加迅捷,对于每一次请求返回的不是整个页面,也仅仅是所需要返回的数据。然而,由于Ajax和REST技术的出现影响了应用程序架构,这迫使人们开始寻求`XML...
  • ft305977550
  • ft305977550
  • 2012-11-27 11:26
  • 4546
    QQ群
    读者交流群:189490960
    我的微信
      与本人单独交流~~
    个人资料
    • 访问:1448914次
    • 积分:23360
    • 等级:
    • 排名:第354名
    • 原创:467篇
    • 转载:7篇
    • 译文:9篇
    • 评论:1891条
    《C程序员从校园到职场》
    《信息通信技术百科全书》
    博客专栏
    博客已搬至微信公众号
    最新评论