JSON简介

JSON是存储和传输数据的格式。JSON经常在数据从服务器发送到网页时使用。JSON指的是 JavaScript Object Notation。JSON是轻量级的数据交换格式。JSON独立于语言。JSON是“自描述的”且易于理解。

当数据在浏览器与服务器之间进行交换时,这些数据只能是文本。JSON属于文本,并且我们能够把任何JavaScript对象转换为JSON,然后将JSON发送到服务器。我们也能把从服务器接收到的任何JSON转换为JavaScript对象。

JSON使用JavaScript语法,但是JSON格式是纯文本的。文本可被任何编程语言作为数据来读取和使用。这里就是以c语言来读取和使用。

JSON语法规则

JSON对象是在花括号内书写的。

  • 数据是名称/值对(也叫键/值对)
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组

下面是一个例子(test1.json):

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": [
                            "GML",
                            "XML"
                        ]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

JSON文件的文件类型是".json"。JSON文本的MIME类型是"application/json"。

cJSON使用

cJSON就是c语言解析JSON的库。

可以从https://sourceforge.net/projects/cjson/下载到源码。

可以直接通过它的示例来使用,首先编译:

F:\httpd\Apache24\cgi-bin>gcc cJSON.c test.c -o testJSON -lm

得到的结果就是testJSON,执行它后的结果(未列全):

F:\httpd\Apache24\cgi-bin>testJSON.exe
{
 “name”: “Jack (“Bee”) Nimble”,
 “format”: {
  “type”: “rect”,
  “width”: 1920,
  “height”: 1080,
  “interlace”: false,
  “frame rate”: 24
 }
}

// 后面的略

它跟如下代码匹配:

char text1[] = "{\n\"name\": \"Jack (\\\"Bee\\\") Nimble\", \n\"format\": {\"type\": \"rect\", \n\"width\": 1920, \n\"height\": 1080, \n\"interlace\":  false,\"frame rate\": 24\n}\n}";

这里的例子是根据字符串(这里会看到很多讨厌的转义符,主要是针对引号),也可以针对JSON文件,这可能更常用,这部分代码原本是注释掉的,可以打开来测试:

dofile("tests/test1.json");

其中test1.json的内容已经在前面介绍过。

得到的结果:

F:\httpd\Apache24\cgi-bin>testJSON.exe
{
 “glossary”: {
  “title”: “example glossary”,
  “GlossDiv”: {
   “title”: “S”,
   “GlossList”: {
    “GlossEntry”: {
     “ID”: “SGML”,
     “SortAs”: “SGML”,
     “GlossTerm”: “Standard Generalized Markup Language”,
     “Acronym”: “SGML”,
     “Abbrev”: “ISO 8879:1986”,
     “GlossDef”: {
      “para”: “A meta-markup language, used to create markup languages such as DocBook.”,
      “GlossSeeAlso”: [“GML”, “XML”]
     },
     “GlossSee”: “markup”
    }
   }
  }
 }
}

内容当然也是一致的。

如果我们需要获取JSON中的某个属性,可以通过cJSON_GetObjectItem()可以根据键来获取其值,下面是一个例子:


#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

// Get the data from file.
// The caller is responsible to free memory.
char *getdata(char* filename)
{
    FILE *f;
    long len;
    char *data;

    f = fopen(filename, "rb");
    if (NULL == f)
    {
        return NULL;
    }
    fseek(f, 0, SEEK_END);
    len = ftell(f);
    fseek(f, 0, SEEK_SET);
    data = (char *)malloc(len + 1);
    fread(data, 1, len, f);
    fclose(f);

    return data;
}

int main(int argc, const char *argv[])
{
    cJSON *json;
    cJSON *subjson;
    char *data;
    char *out;

    printf("Parsing JSON ...\n");
    data = getdata("tests/test1.json");
    if (NULL == data)
    {
        printf("Get data failed.\n");
        goto EXIT;
    }

    // Convert file data to JSON.
    json = cJSON_Parse(data);
    if (json)
    {
        printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
        out = cJSON_Print(json);
        printf("%s\n", out);
        free(out);
        printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
    }
    else
    {
        printf("Parse data failed.\n");
        goto EXIT;
    }

    subjson = cJSON_GetObjectItem(json, "glossary");
    if (subjson)
    {
        printf(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n");
        out = cJSON_Print(subjson);
        printf("%s\n", out);
        free(out);
        printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
    }
    else
    {
        printf("Get item failed.\n");
        goto EXIT;
    }

EXIT:

    if (NULL != data)
    {
        free(data);
    }

    if (NULL != json)
    {
        cJSON_Delete(json);
    }

    return 0;
}

得到结果:

F:\httpd\Apache24\cgi-bin>json.exe
Parsing JSON …
{
 “glossary”: {
  “title”: “example glossary”,
  “GlossDiv”: {
   “title”: “S”,
   “GlossList”: {
    “GlossEntry”: {
     “ID”: “SGML”,
     “SortAs”: “SGML”,
     “GlossTerm”: “Standard Generalized Markup Language”,
     “Acronym”: “SGML”,
     “Abbrev”: “ISO 8879:1986”,
     “GlossDef”: {
      “para”: “A meta-markup language, used to create markup languages such as DocBook.”,
      “GlossSeeAlso”: [“GML”, “XML”]
     },
     “GlossSee”: “markup”
    }
   }
  }
 }
}

+++++++++++++++++++++++++++++++++++++++++++++++++
{
 “title”: “example glossary”,
 “GlossDiv”: {
  “title”: “S”,
  “GlossList”: {
   “GlossEntry”: {
    “ID”: “SGML”,
    “SortAs”: “SGML”,
    “GlossTerm”: “Standard Generalized Markup Language”,
    “Acronym”: “SGML”,
    “Abbrev”: “ISO 8879:1986”,
    “GlossDef”: {
     “para”: “A meta-markup language, used to create markup languages such as DocBook.”,
     “GlossSeeAlso”: [“GML”, “XML”]
    },
    “GlossSee”: “markup”
   }
  }
 }
}

+++++++++++++++++++++++++++++++++++++++++++++++++

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐