目录
一、什么是Json
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它是基于JavaScript语言的子集,但是独立于编程语言的文字格式。JSON格式易于阅读和编写,同时也易于机器解析和生成。它常用于前端和后端之间的数据交换以及存储配置信息。JSON数据由键值对构成,可以表示对象和数组。由于其简洁性和易用性,JSON已经成为了互联网上常用的数据交换格式之一。
JSON的优点:
1、易读性: JSON使用键值对的方式表示数据,易于阅读和编辑。
2、易解析性: JSON格式简单,易于解析和转换成数据对象,适合用于前后端数据交换。
3、跨语言性: JSON是一种独立于编程语言的数据格式,可以在各种编程语言中使用和解析。
4、数据量小: JSON数据量轻量,适合网络传输,响应速度快。
5、可嵌套性: JSON支持嵌套对象和数组,可以表示复杂结构的数据。
JSON的应用场景:
1、Web开发: 在前后端交互中,常用JSON格式传输数据,如通过AJAX请求获取数据。
2、API设计: JSON常用于设计RESTful API,作为数据交换格式,方便不同应用之间数据交互。
3、配置文件: JSON格式适合用于存储配置信息,如项目配置、数据映射等。
4、移动应用开发: 在移动应用中,常用JSON格式作为数据交互的标准格式,例如移动端与服务器接口的数据交互。
二、Josn基本结构
2.1Josn对象
JSON(JavaScript Object Notation)对象是 JSON 中最常用的一种结构。它由大括号 {} 包裹,包含一组键值对,每个键值对之间通过逗号分隔。
JSON 对象的基本结构:
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
每个键值对由键(key)和值(value)组成,用冒号分隔。键是一个字符串,用双引号括起来,然后是冒号,而值可以是字符串、数值、布尔值、数组、甚至是另一个JSON对象。
2.2C++使用Josn
#include <iostream>
#include <string>
#include <vector>
class Address {
public:
std::string street;
std::string city;
};
class Person {
public:
std::string name;
int age;
Address address;
std::vector<std::string> hobbies;
};
int main() {
Person person;
person.name = "John";
person.age = 30;
person.address.street = "123 Main St";
person.address.city = "New York";
person.hobbies = {"Reading", "Hiking"};
// 将Person对象转换为JSON字符串
nlohmann::json j;
j["person"]["name"] = person.name;
j["person"]["age"] = person.age;
j["person"]["address"]["street"] = person.address.street;
j["person"]["address"]["city"] = person.address.city;
j["person"]["hobbies"] = person.hobbies;
std::string jsonStr = j.dump();
std::cout << jsonStr << std::endl;
return 0;
}
最后数据为:
{
"person": {
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York"
},
"hobbies": ["Reading", "Hiking"]
}
}
2.3.1解析Josn格式的数据
1、RapidJSON:RapidJSON是一个非常快速的JSON解析库,它提供了简单的API来解析和生成JSON数据。
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"
#include <iostream>
#include <string>
int main() {
const char* json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
rapidjson::Document doc;
doc.Parse(json);
if (!doc.HasParseError()) {
std::string name = doc["name"].GetString();
int age = doc["age"].GetInt();
std::string city = doc["city"].GetString();
std::cout << "Name: " << name << ", Age: " << age << ", City: " << city << std::endl;
} else {
std::cout << "JSON parse error" << std::endl;
}
return 0;
}
2、JSON for Modern C++ (nlohmann/json):这是一个现代C++中使用的非常流行的JSON解析库。它提供了简单的API和STL兼容性,容易学习和使用。
示例代码:
#include <nlohmann/json.hpp>
#include <iostream>
#include <string>
int main() {
std::string json = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
nlohmann::json j = nlohmann::json::parse(json);
std::string name = j["name"];
int age = j["age"];
std::string city = j["city"];
std::cout << "Name: " << name << ", Age: " << age << ", City: " << city << std::endl;
return 0;
}
2.4Linux编程(vscode)使用Josn
头文件:#include <jsoncpp/json/json.h>
序列化:
bool Serialize(std::string* out)
{
// 转换成为字符串
Json::Value root;
root["x"] = _x;
root["y"] = _y;
root["oper"] = _oper;
Json::FastWriter writer;
// Json::StyledWriter writer;
*out = writer.write(root);
return true;
}
反序列化:
bool Deserialize(const std::string& in) // 你怎么知道你读到的in 就是完整的一个请求呢?
{
Json::Value root;
Json::Reader reader;
bool res = reader.parse(in, root);
if (!res)
return false;
_x = root["x"].asInt();
_y = root["y"].asInt();
_oper = root["oper"].asInt();
return true;
}