Linux/C++:Json--网络编程中的奇妙小工具

目录

一、什么是Json

二、Josn基本结构

2.1Josn对象

2.2C++使用Josn

 2.3.1解析Josn格式的数据

2.4Linux编程(vscode)使用Josn


一、什么是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;
}

相关推荐

  1. Linux/C++:Json--网络编程奇妙工具

    2024-07-15 05:22:01       30 阅读
  2. Go入门:探索编程奇妙世界

    2024-07-15 05:22:01       55 阅读
  3. Python网络编程

    2024-07-15 05:22:01       56 阅读
  4. Rust:入门指南与编程奇妙冒险

    2024-07-15 05:22:01       61 阅读
  5. 工作记录

    2024-07-15 05:22:01       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-15 05:22:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-15 05:22:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-15 05:22:01       58 阅读
  4. Python语言-面向对象

    2024-07-15 05:22:01       69 阅读

热门阅读

  1. Flask `preprocess_request` 方法教程

    2024-07-15 05:22:01       19 阅读
  2. C# Winform之propertyGrid控件使用详解和分组设置

    2024-07-15 05:22:01       26 阅读
  3. ComfyUl提示词技巧

    2024-07-15 05:22:01       29 阅读
  4. 基于智能算法的品牌视觉识别系统优化研究

    2024-07-15 05:22:01       23 阅读
  5. Windows图形界面(GUI)-DLG-C/C++ - 图形界面程序结构

    2024-07-15 05:22:01       29 阅读