JSON(JavaScript Object Notation) JavaScript 对象表示法,是一种轻量级的数据交换格式。类似于XML。

基础结构

JSON基于两种结构(即由两种结构组成:对象(键值对集合)和数组):
  • “名称/值”对的集合(A collection of name/value pairs)对象。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
  • 有序列表值(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。

基础形式

Json有以下形式:

1. 对象(object)是一个无序的键值对集合。以{开始,以}结束,键值间用:分隔,键值对间用,分隔。

2. 数组(array)是值(value)的有序集合。一个数组以[开始,以]结束,值之间用,分割。

3. 值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array),共7种类型。这些结构可以嵌套。

4. 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。

下图是字符串表示方法:

5. 数值(number)也与C或java数值非常相似,只是json没有8进制和16进制格式。

数据访问

json对象类似于结构体,可以用点号访问赋值。

json数组元素以0开头。

Json示例

{
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}

以javascript为例,创建var变量赋值:

var web = {
"sites": [
{ "name":"菜鸟教程" , "url":"www.runoob.com" },
{ "name":"google" , "url":"www.google.com" },
{ "name":"微博" , "url":"www.weibo.com" }
]
}

可通过web.sites[1].name获取字符串google。

可通过web.sites[2].name = "webo" 修改“微博”为“webo”。

JSON C解析

json常用的c解析为cJSON,只需要两个文件,cJSON.h和cJSON.c,地址:https://github.com/DaveGamble/cJSON。该网站一个示例:

保存json数据:

{
"name": "Awesome 4K",
"resolutions": [
{
"width": ,
"height":
},
{
"width": ,
"height":
},
{
"width": ,
"height":
}
]
}

保存函数:

char *create_monitor_with_helpers(void)
{
const unsigned int resolution_numbers[][] = {
{, },
{, },
{, }
};
char *string = NULL;
cJSON *resolutions = NULL;
size_t index = ; cJSON *monitor = cJSON_CreateObject(); if (cJSON_AddStringToObject(monitor, "name", "Awesome 4K") == NULL)
{
goto end;
} resolutions = cJSON_AddArrayToObject(monitor, "resolutions");
if (resolutions == NULL)
{
goto end;
} for (index = ; index < (sizeof(resolution_numbers) / ( * sizeof(int))); ++index)
{
cJSON *resolution = cJSON_CreateObject(); if (cJSON_AddNumberToObject(resolution, "width", resolution_numbers[index][]) == NULL)
{
goto end;
} if(cJSON_AddNumberToObject(resolution, "height", resolution_numbers[index][]) == NULL)
{
goto end;
} cJSON_AddItemToArray(resolutions, resolution);
} string = cJSON_Print(monitor);
if (string == NULL) {
fprintf(stderr, "Failed to print monitor.\n");
} end:
cJSON_Delete(monitor);
return string;
}

解析函数:

int supports_full_hd(const char * const monitor)
{
const cJSON *resolution = NULL;
const cJSON *resolutions = NULL;
const cJSON *name = NULL;
int status = ;
cJSON *monitor_json = cJSON_Parse(monitor);
if (monitor_json == NULL)
{
const char *error_ptr = cJSON_GetErrorPtr();
if (error_ptr != NULL)
{
fprintf(stderr, "Error before: %s\n", error_ptr);
}
status = ;
goto end;
} name = cJSON_GetObjectItemCaseSensitive(monitor_json, "name");
if (cJSON_IsString(name) && (name->valuestring != NULL))
{
printf("Checking monitor \"%s\"\n", name->valuestring);
} resolutions = cJSON_GetObjectItemCaseSensitive(monitor_json, "resolutions");
cJSON_ArrayForEach(resolution, resolutions)
{
cJSON *width = cJSON_GetObjectItemCaseSensitive(resolution, "width");
cJSON *height = cJSON_GetObjectItemCaseSensitive(resolution, "height"); if (!cJSON_IsNumber(width) || !cJSON_IsNumber(height))
{
status = ;
goto end;
} if ((width->valuedouble == ) && (height->valuedouble == ))
{
status = ;
goto end;
}
} end:
cJSON_Delete(monitor_json);
return status;
}

XML与JSON比较

* 格式简单易于解析和生成,内容灵活。
同一信息JSON和XML表示示例:
JSON表示方法:

{
"author" : "Gambardella, Matthew",
"title" : "XML Developer's Guide",
"genre" : "Computer"
}
XML示例:

<book>
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
</book>
对于XML数据,其本身是一个DOM Tree的数据结构,开发人员必须使用DOM API来访问和处理XML数据;而且DOM在各个浏览器中的实现也不尽相同,所以针对XML DOM的编程方式会变的更为复杂,另外对于XMLDOM,浏览器目前还不支持类似于XPath这样的查询语句,显然对于XMLDOM数据的访问显然要比访问JSON复杂多了。

* 性能
从数据传输量上来看JSON显然要优于XML,JSON更轻量级一些,它没有像XML那样多的Open和Closing标记。同时在对数据的解析速度上,JSON也要优于XML。

* 安全性
XML要强于JSON。

* 序列化
XML要比JSON方便。

JSON工具

命令行终端格式化显示json串:python -m json.tool {}

参考:

1. http://www.runoob.com/json/json-tutorial.html

2. http://www.json.org

3. http://www.json.org/fatfree.html

4. JSON 数据格式

5. cJSON github

6. JSON构造/解析(by C)---cJSON和json-c

7. JSON C库的使用

JSON简述的更多相关文章

  1. 002-自定义打开terminal,以及快捷键,其他程序类似,ssh管理-sshpass, Shuttle

    一.利用Automator软件完成服务设定 1.使用Command+Space,打开Spotlight,搜索Automator 2.搜索到之后,双击打开,选择“服务[或快速操作]” 3.将“服务收到[ ...

  2. Nodejs + TypeScript

    Node.js https://nodejs.org https://nodejs.org/en/download/ win: msi mac: pkg linux: tar.xz source co ...

  3. JWT【JSON Web Token】 简述

    draft: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html http://tools.ietf.org/html/ ...

  4. 【ASP.NET Core】JSON Patch 使用简述

    JSON Patch 是啥玩意儿?不知道,直接翻译吧,就叫它“Json 补丁”吧.干吗用的呢?当然是用来修改 JSON 文档的了.那咋修改呢?比较常见有四大操作:AMRR. 咋解释呢? A—— Add ...

  5. 简述json模块

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,他的数据结构与Python中的字典一样,键值对来表示数据间的关系,可以包含列表. 在编写 ...

  6. 简述什么是ajax、javascript、json、Jquery?

    什么是Javascript? 基于对象.解释型.事件驱动.脚本语言.封装在<script>标签中使用.弱类型.与浏览器交互执行 什么 是Ajax? ajax是一种编程模式.在客户端与服务器 ...

  7. Newtonsoft—Json.NET常用方法简述

    Json.NET常用方法汇总(可解决日常百分之90的需求) 0.Json.NET基础用法 首先去官网下载最新的Newtonsoft.Json.dll(也可以使用VS自带的NuGet搜索Json.NET ...

  8. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  9. JSON 与 JSONP

    JSON (JavaScript Object Notation) is a lightweight data-interchange format. 即 JSON 是一种轻量级的数据交换格式. 1. ...

随机推荐

  1. Redis中为什么使用跳表---------转自http://blog.csdn.net/u010412301/article/details/64923131

    最近在研究数据库的一些底层实现,百度的面试官问到了跳表,当时没有回答上来,在csdn上看到了这篇文章,感觉写的比较好,希望大家可以多多交流. Redis里面使用skiplist是为了实现sorted ...

  2. OpenCV 之 直方图处理

    1  图像直方图 1.1  定义 统计各个像素值,在整幅图像中出现次数的一个分布函数.        1.2  标准化 $\quad p_r(r_k) = \frac{n_k}{MN} \qquad ...

  3. docker学习笔记二:常用命令

    docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...

  4. mysql结构相同的三张表查询一条记录\将一张表中的数据插入另外一张表

    将一张表中的数据插入另外一张表 1.两张表结构相同 insert into 表1名称 select * from 表2名称 2.两张结构不相同的表 insert into 表1名称(列名1,列名2,列 ...

  5. qt linux软件打包等

    我的脚本: #!/bin/sh appname=`basename $0 | sed s,\.sh$,,` dirname=`dirname $0` tmp="${dirname#?}&qu ...

  6. js中求水仙花数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. vim 中Taglist的安装和使用

    将vim 改造成功能强大的IDE系列之二 『插件介绍』 Taglist是vim的一个插件,提供源代码符号的结构化视图. 效果图:(直接使用了别人的图片.在我机器上也差不多-) 『下载和安装』 1)从h ...

  8. Unity 逻辑层通知UI 通过接口消除他们通信的switch判断

    需求如何:  用户名字长度为2-12之间,  如果错误在界面上弹出一个消息框 写烂一点 public void PostRename(string name) { if (string.IsNullO ...

  9. 中国版Azure支持那些版本号Linux

    不在下述列表中的Linux表示尚未经过正式验证,并不意味着不能使用,客户能够通过自行上传镜像文件的方式使用其它Linux版本号,可是不保证是否遇到一些驱动或者兼容问题. 分发 版本号 上次验证时间 驱 ...

  10. (42)JS运动之多物体框架--多个div变宽

    假设仅仅为div加入一个定时器的话.在多个div变宽的时候会发生故障.可是假设为每一个div加入一个定时器.那么就能够实现多个物体变宽. 注意:在多物体运动的情况下,全部东西不能共用.offsetXX ...