JSON定义及解析,JSON文件读写
文章目录
- 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中有两类分别是dog和cat。(两个是平行关系)
dog中有两条狗:
第一条name是Rufus,age是15。
第二条name是Marty,age是空。
cat中有两只猫:
第一只name是bosi,age是15。
第二只name是maowang,age是空。
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文件读写相关推荐
- sql解析json格式字段、sql关联json格式字段,mysql解析json、sql解析json字符串
sql解析json格式字段.sql关联json格式字段,mysql解析json.sql解析json字符串 sql解析字符串 sql关联json中的某个字段 sql解析字符串 表名user_login ...
- js html 处理json数据,js 解析JSON数据
链接原文转自:http://www.w3cschool.cn/json/xumd1piw.html http://www.cnblogs.com/zoumiaomiao/p/4909539.html ...
- html5处理json数据,js解析json数组
js读取解析JSON类型数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 Jav ...
- html页面解析json,JavaScript如何解析json?
javascript如何解析json?下面本篇文章就来给大家介绍一下使用javascript解析json的方法,希望对大家有所帮助. 什么是JSON?JSON 指的是 JavaScript 对象表示法 ...
- json java typeof_java解析json
1:下载另外一个Java的小包就可以了: http://www.JSON.org/java/json_simple.zip 里面有源码和文档例题和编程的lib包:编程只需要json_simple.ja ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)...
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- json.net java_java解析JSON (使用net.sf.json)
例如JSON字符串str如下: { "data": [ { "basic_title": "运筹帷幄因特网", "basic_cr ...
- Xamarin调用JSON.net来解析JSON
再来我们要怎么解析JSON格示呢?在.net 中,我们很孰悉的JSON.net,没错,我们依然可以在Xamarin中使用他 感谢社群伟大的贡献 下载网址: http://components.xa ...
- mysql解析json字符串_Mysql解析json字符串/数组
1 Mysql解析json字符串 解决方法:JSON_EXTRACT(原字段,'$.json字段名') 执行SQL: SELECT JSON_EXTRACT( t.result,'$.row'), J ...
最新文章
- 网警信息安全!_只愿与一人十指紧扣_新浪博客
- Java 性能调优的 11 个实用技巧
- tomcat cpu占用过高,系统负载高问题跟踪
- Matlab调用Java类访问数据库
- JavaScript教程之事件处理
- jedivim加载失败,提示没有支持python3,(markdown也是如此)
- 浅谈C中的malloc和free
- Spring学习笔记—最小化Spring XML配置
- 走台阶一共有多少种走法
- linux 文件名带特殊符号,Linux删除含有特殊符号文件名的文件
- PYTHON解析XML的多种方式效率对比实测
- 基于Springboot的高校课程管理系统 课程设计报告 毕业设计 包括报告和程序包
- SocksCap64全局代理工具使用+Clash使用命令行
- unity3d学习笔记-特效(1.粒子系统)
- 移动端Web组件-Dialog对话框
- 编写程序:实现输出100以内质数的功能
- MySQL--通过mysqladmin命令修改密码提示:single quotes were not trimmed line client(Windows)
- 【算法导论】 内部排序算法总结
- mysql8.0 无法加载身份验证插件“缓存_sha2_密码” 问题解决方法
- 五子棋智能算法——决策树编程实现(三)
热门文章
- 设计模式--代理(Proxy)模式
- 设计模式--原型(Prototype)模式
- 异常:javax.servlet.jsp.PageContext cannot be resolved to a type
- 135. 分发糖果(贪心算法)
- 关于AttributeError: type object ‘XXX‘ has no attribute ‘XXX‘的问题
- html数字变换插件,轻量级jquery数字动画插件
- Windows驱动开发学习笔记(三)—— 内核空间内核模块
- 方式四:修改模块导入段来拦截API
- CSS3的绝对定位与相对定位
- 2.1 基础-数字翻转