0%

关于json文件的一些知识

前言

什么是 JSON ?

  1. JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  2. JSON 是轻量级的文本数据交换格式
  3. JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持 JSON
  4. JSON 具有自我描述性,更易理解

这里有一些json的工具以后可能会用到:

JSON 格式化工具
JSON 转义/去除转义
JSON 在线解析工具
JSON 差异对比工具

来开始看看json的结构

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"name":"wangsong",
"age":"23",
"hobbies":["Swimmming","Running"],
"address":{
"city":"Huzhou",
"Inc":"Huzhou institute of Zhejiang University",
"coordinates":{
"latitude":40.7128,
"longitude":-74.0060
}
}
}
  • 在json中使用{}来定义一个对象,括号中的一切都代表存储数据的键值对

  • 其中name是键(key),wangsong是值(value)

  • 数组采用[]进行定义其中的元素用,分隔

  • 每个键值对之间用逗号隔开直到最后一个

  • 可以在json中进行对象的嵌套

让我们看看如何访问json文件

python

使用json模块将json数据转换为字典进行使用

1
2
3
4
import json
personal_data = json.loads(personal_data.json)
# accessing data
print(personal_data['name']) # "wangsong"

cpp

在cpp中想要使用json文件就需要配置jsoncppp

  1. 拉取jsoncpp的源码

  2. 打开你下载的jsoncpp文件夹

  3. 双击运行amalgamate.py文件(需要有python环境)

  4. 操作后,会生成一个dist的文件夹里面就是我们需要的jsoncpp的源代码了,只有三个文件可以直接包含到项目中一起编译这个源文件还是跨平台的,在windows下和linux下都可以使用

或者按照我接下来的实践进行操作

  1. 拉取jsoncpp源码,查看源码中找到cmake安装文件进行安装

  2. 编写流式读取代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <json/json.h>
#include <fstream>
#include <iostream>

using namespace std;

int main() {
// 1. 检查文件是否成功打开
ifstream ifs("myjson/wangsong.json");
if (!ifs.is_open()) {
cerr << "错误:无法打开文件" << endl;
return 1;
}

Json::Reader reader;
Json::Value root; // 使用更清晰的变量名

// 2. 检查解析是否成功
if (!reader.parse(ifs, root)) {
cerr << "JSON解析错误:" << reader.getFormattedErrorMessages() << endl;
return 1;
}

// 3. 正确访问各字段
// 访问顶层字段
cout << "姓名: " << root["name"].asString() << endl;

// 访问空键名字段(JSON中键名为""的字段)
if (root.isMember("age")) {
cout << "年龄: " << root["age"].asString() << endl;
} else {
cout << "警告:未找到年龄字段" << endl;
}

// 访问数组
cout << "爱好: ";
const Json::Value& hobbies = root["hobbies"];
for (const auto& hobby : hobbies) {
cout << hobby.asString() << " ";
}
cout << endl;

// 4. 访问嵌套对象(需要逐级访问)
const Json::Value& address = root["address"];
cout << "城市: " << address["city"].asString() << endl;
cout << "机构: " << address["Inc"].asString() << endl;

const Json::Value& coords = address["coordinates"];
cout << "纬度: " << coords["latitude"].asFloat() << endl;
cout << "经度: " << coords["longitude"].asFloat() << endl;

return 0;
}
  1. 输入代码进行编译g++ filename.cpp -ljsoncpp -std=c++11 -o progname,也可以使用ctrl + shift +b进行编译但是要注意修改taske.josn中的配置。

fixtasks

成功编译后输入./progname进行运行

mydatajson