文章目录

  • JSON 定义
  • 要点
  • 简单的JSON实例
  • JSON的文档结构
    • 对象
    • 数组
  • 数据类型
    • 字符串说明
  • 关于轨道图的嵌套
  • JSON实例
  • 使用JsonCpp进行JSON文件读写
    • 类图关系
    • 常用接口
    • 官网下载地址
    • 写对象
    • 写数组
    • 写JSON实例
    • JSON写入文件
    • 从JSON文件读取数据

JSON 定义

轻量级数据交换格式,并且容易阅读和编写,同时方便机器解析和生成。
JSON 采用完全独立于程序语言的文本格式,可以被各种语言解析。

要点

想要理解JSON,一个非常重要的就是要理解递归,因为JSON里面可以通过递归无限嵌套。

简单的JSON实例

{"animals":{"dog":[{"name": "Rufus", "age": 15},{"name": "Marty","age": null}],"cat":[{"name": "bosi","age": 15},{"name": "maowang","age": null}]}
}

animals表示用来描述动物的对象。
animals中有两类分别是dogcat。(两个是平行关系)
dog中有两条狗:
第一条nameRufusage15
第二条nameMartyage
cat中有两只猫:
第一只namebosiage15
第二只namemaowangage

JSON的文档结构

JSON中基本结构只有两种,对象和数组,通过这两种结构递归嵌套可以表示各种复杂的结构。

对象

JSON对象轨道图

JSON对象是无序的 " ’ 名称 : 值 ’ 对 " 集合。
对象从 { 开始,从 } 结束。
每个名称后面跟一个冒号 :后面跟值。
" ’ 名称 : 值 ’ 对 "之间用逗号 ,分隔。
同一层次 名称不能重复。
名称只能是string类型。
底层实现是map。

上面可能说明的不是很清楚,我们举例进行说明:
举例示范:

 { } 表示空对象
{"name":"zhangsan"}  表示含有一个 名称:值 的对象,可以理解为含有一个 k - v
{"name":"zhangsan","sex":"f","age":23}  含有多个 k-v 的对象,多个对象之间用 , 隔开

数组

JSON数组轨道图

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

举例示范:

[]       空数组
[1] ["abc"]       还有一个元素的数组
[1,"china",null,33,4,{"q":"a"}]       含有多个元素的数组

数据类型


上面非常直观的显示了value的类型。

举例示范:

数字(整数或浮点数)   123
字符串(在双引号中)  "abc" 逻辑值(true 或 false) true false
数组(在方括号中)       [1,2,3]
对象(在花括号中)       {"abc":123}
null                null

字符串说明

举例示范:

不含控制字符        "abc"
含有控制字符      "a\\

关于轨道图的嵌套


轨道图可以无限递归,value可以是array,也可以是object,那么就可以嵌套出各种复杂的结构。

JSON实例

{    //对象"FirstName": "John","LastName": "Doe","Age": 43,"Address": {        //对象嵌套对象"Street": "Downing Street 10","City": "London","Country": "Great Britain"},"Phone numbers": [ //对象嵌的value嵌套数组"+44 1234567","+44 2345678"]
}
{        //对象"employees": [    //对象嵌套数组,数组元素是对象{"firstName": "Bill","lastName": "Gates"},{"firstName": "George","lastName": "Bush"},{"firstName": "Thomas","lastName": "Carter"}]
}
{"teachers": [     //对象嵌套对象{"name": "黄波","course": "网页高级设计"},{"name": "贺敏","course": "Java 程序设计"},{"name": "毛丽娟","course": "JavaScript 程序设计"}],"students": [     //对象嵌套对象{"name": "张三","age": 20},{"name": "李四","age": 21},{"name": "王五","age": 19}]
}

上面的例子就非常容易理解了,主要是理解JSON结构的嵌套。

使用JsonCpp进行JSON文件读写

类图关系

namespace Json {// writer.hclass FastWriter;class StyledWriter;// reader.hclass Reader;// features.hclass Features;// value.htypedef unsigned int ArrayIndex;class StaticString;class Path;class PathArgument;class Value;class ValueIteratorBase;class ValueIterator;class ValueConstIterator;
} // namespace Js


常用接口

官网下载地址

点击进入JsonCpp官网地址

写对象

#include <iostream>
#include "json/json.h"
using namespace Json;
using namespace std;
int main()
{Value rootObj;rootObj["name"] = "zhangsan";rootObj["sex"] = "f";rootObj["age"] = 23;Value childObj;childObj["birth"] = "19990909";childObj["hobby"] = "basketball";rootObj["other"] =  childObj;string str = rootObj.toStyledString();cout << str << endl;return 0;
}

运行结果:

对象底层是map,通过 k-v 获取所以没有顺序。

写数组

#include <iostream>
#include "json/json.h"
using namespace Json;
using namespace std;
int main()
{Value array;for (int i = 0; i < 10; i++){array.append(i);}Value array2;for (int i = 10; i < 20; i++){array2.append(i);}Value obj;obj["k"] = "v";array.append(obj);array.append(array2);string str = array.toStyledString();cout << str << endl;return 0;
}

运行结果:

写JSON实例

我们对于上面的实例进行操作。

{    //对象"FirstName": "John","LastName": "Doe","Age": 43,"Address": {        //对象嵌套对象"Street": "Downing Street 10","City": "London","Country": "Great Britain"},"Phone numbers": [ //对象嵌的value嵌套数组"+44 1234567","+44 2345678"]
}
#include <iostream>
#include "json/json.h"
using namespace Json;
using namespace std;
int main()
{Value rootObj;rootObj["FirstName"] = "John";rootObj["LastName"] = "Doe";rootObj["Age"] = 43;Value childObj;childObj["Street"] = "Downing Street 10";childObj["City"] = "London";childObj["Country"] = "Great Britain";rootObj["Address"] = childObj;Value array;array.append("+44 1234567");array.append("+44 2345678");rootObj["Phone numbers"] = array;string str = rootObj.toStyledString();cout << str << endl;return 0;
}

运行结果:

JSON写入文件

#include <iostream>
#include "json/json.h"
#include <fstream>
using namespace Json;
using namespace std;
int main()
{Value rootObj;rootObj["FirstName"] = "John";rootObj["LastName"] = "Doe";rootObj["Age"] = 43;Value childObj;childObj["Street"] = "Downing Street 10";childObj["City"] = "London";childObj["Country"] = "Great Britain";rootObj["Address"] = childObj;Value array;array.append("+44 1234567");array.append("+44 2345678");rootObj["Phone numbers"] = array;string str = rootObj.toStyledString();cout << str << endl;fstream fs("my.json",ios::out);fs << str;fs.close();return 0;
}

运行结果:打开文件

从JSON文件读取数据

#include <iostream>
#include "json/json.h"
#include <fstream>using namespace Json;
using namespace std;int main()
{fstream fs("my.json", ios::in);if (!fs)cout << "open error" << endl;Reader reader;Value value;if (!reader.parse(fs, value))cout << "parse error" << endl;cout << value["FirstName"].asString() << endl;cout << value["LastName"].asString() << endl;cout << value["Age"].asInt() << endl;cout << value["FirstName"].asString() << endl;cout << value["LastName"].asString() << endl;cout << value["Address"]["Country"].asString() << endl;cout << value["Address"]["City"].asString() << endl;cout << value["Address"]["Street"].asString() << endl;for (int i = 0; i < value["Phone numbers"].size(); i++){cout << value["Phone numbers"][i].asString() << endl;}return 0;
}

运行结果:

JSON定义及解析,JSON文件读写相关推荐

  1. sql解析json格式字段、sql关联json格式字段,mysql解析json、sql解析json字符串

    sql解析json格式字段.sql关联json格式字段,mysql解析json.sql解析json字符串 sql解析字符串 sql关联json中的某个字段 sql解析字符串 表名user_login ...

  2. js html 处理json数据,js 解析JSON数据

    链接原文转自:http://www.w3cschool.cn/json/xumd1piw.html http://www.cnblogs.com/zoumiaomiao/p/4909539.html ...

  3. html5处理json数据,js解析json数组

    js读取解析JSON类型数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 Jav ...

  4. html页面解析json,JavaScript如何解析json?

    javascript如何解析json?下面本篇文章就来给大家介绍一下使用javascript解析json的方法,希望对大家有所帮助. 什么是JSON?JSON 指的是 JavaScript 对象表示法 ...

  5. json java typeof_java解析json

    1:下载另外一个Java的小包就可以了: http://www.JSON.org/java/json_simple.zip 里面有源码和文档例题和编程的lib包:编程只需要json_simple.ja ...

  6. 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)...

    在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...

  7. json.net java_java解析JSON (使用net.sf.json)

    例如JSON字符串str如下: { "data": [ { "basic_title": "运筹帷幄因特网", "basic_cr ...

  8. Xamarin调用JSON.net来解析JSON

      再来我们要怎么解析JSON格示呢?在.net 中,我们很孰悉的JSON.net,没错,我们依然可以在Xamarin中使用他 感谢社群伟大的贡献 下载网址: http://components.xa ...

  9. mysql解析json字符串_Mysql解析json字符串/数组

    1 Mysql解析json字符串 解决方法:JSON_EXTRACT(原字段,'$.json字段名') 执行SQL: SELECT JSON_EXTRACT( t.result,'$.row'), J ...

最新文章

  1. 网警信息安全!_只愿与一人十指紧扣_新浪博客
  2. Java 性能调优的 11 个实用技巧
  3. tomcat cpu占用过高,系统负载高问题跟踪
  4. Matlab调用Java类访问数据库
  5. JavaScript教程之事件处理
  6. jedivim加载失败,提示没有支持python3,(markdown也是如此)
  7. 浅谈C中的malloc和free
  8. Spring学习笔记—最小化Spring XML配置
  9. 走台阶一共有多少种走法
  10. linux 文件名带特殊符号,Linux删除含有特殊符号文件名的文件
  11. PYTHON解析XML的多种方式效率对比实测
  12. 基于Springboot的高校课程管理系统 课程设计报告 毕业设计 包括报告和程序包
  13. SocksCap64全局代理工具使用+Clash使用命令行
  14. unity3d学习笔记-特效(1.粒子系统)
  15. 移动端Web组件-Dialog对话框
  16. 编写程序:实现输出100以内质数的功能
  17. MySQL--通过mysqladmin命令修改密码提示:single quotes were not trimmed line client(Windows)
  18. 【算法导论】 内部排序算法总结
  19. mysql8.0 无法加载身份验证插件“缓存_sha2_密码” 问题解决方法
  20. 五子棋智能算法——决策树编程实现(三)

热门文章

  1. 设计模式--代理(Proxy)模式
  2. 设计模式--原型(Prototype)模式
  3. 异常:javax.servlet.jsp.PageContext cannot be resolved to a type
  4. 135. 分发糖果(贪心算法)
  5. 关于AttributeError: type object ‘XXX‘ has no attribute ‘XXX‘的问题
  6. html数字变换插件,轻量级jquery数字动画插件
  7. Windows驱动开发学习笔记(三)—— 内核空间内核模块
  8. 方式四:修改模块导入段来拦截API
  9. CSS3的绝对定位与相对定位
  10. 2.1 基础-数字翻转