json解析教程(2)C++ json解析实战之解析内存字符串

今天介绍如何解析内存字符串。

demo1 简单object对象解析

{
	"Age": 20, 
	"Name": "colin"
}
#include "json/json.h"
#include <iostream>
/**
 * \brief Parse a raw string into Value object using the CharReaderBuilder
 * class, or the legacy Reader class.
 * Example Usage:
 * $g++ readFromString.cpp -ljsoncpp -std=c++11 -o readFromString
 * $./readFromString
 * colin
 * 20
 */
int main() {
    const std::string rawJson = R"({"Age": 20, "Name": "colin"})";
    const auto rawJsonLength = static_cast<int>(rawJson.length());
   
    JSONCPP_STRING err;
    Json::Value root;

    Json::CharReaderBuilder builder;
    const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
    if (!reader->parse(rawJson.c_str(), rawJson.c_str() + rawJsonLength, &root,
        &err)) {
        std::cout << "error" << std::endl;
        return EXIT_FAILURE;
    }
    const std::string name = root["Name"].asString();
    const int age = root["Age"].asInt();

    std::cout << name << std::endl;
    std::cout << age << std::endl;
    return EXIT_SUCCESS;
}

在进行解析时我们应该做一些类型检查,直接将value转为自己期待的类型时,如果事实不是,那么会抛出异常。比如期待age是int,如果传入的json中是字符串,那么将出错,所以应写成:

    if (root["Name"].isString()) {
        const std::string name = root["Name"].asString();
        std::cout << name << std::endl;
    }
    
    if (root["Age"].isInt()) {
        int age = root["Age"].asInt();
        std::cout << age << std::endl;
    }

各种类型的判断函数如下:
在这里插入图片描述

demo2 封装成工具类JsonParse

#include "json/json.h"
#include <iostream>
/**
 * \brief Parse a raw string into Value object using the CharReaderBuilder
 * class, or the legacy Reader class.
 * Example Usage:
 * $g++ readFromString.cpp -ljsoncpp -std=c++11 -o readFromString
 * $./readFromString
 * colin
 * 20
 */

class JsonParse {
public:
	static bool JsonParseFromString(const std::string &json_string, Json::Value *root) {
		JSONCPP_STRING err;
		const auto json_string_len = static_cast<int>(json_string.length());

		Json::CharReaderBuilder builder;
		const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
		if (!reader->parse(json_string.c_str(), json_string.c_str() + json_string_len, root,
						   &err)) {
		  std::cout << "error" << std::endl;
		  return false;
		}
		return true;
	}
};

int main() {
	const std::string rawJson = R"({"Age": 20, "Name": "colin"})";

	Json::Value root;
	JsonParse::JsonParseFromString(rawJson, &root);
	const std::string name = root["Name"].asString();
	const int age = root["Age"].asInt();

	std::cout << name << std::endl;
	std::cout << age << std::endl;
	return EXIT_SUCCESS;
}

demo3 解析数组


int main() {
	const std::string rawJson = R"({
		"source_ip":"192.168.10.188",
		"payload":{
			"event":"area intrusion",
			"image_list":[
				{
					"url":"http://www.baidu.com/omega.jpg",
					"timestamp": 176488454545
				},
				{
					"url":"http://www.baidu.com/delta.jpg",
					"timestamp": 176488454545
				}
			]
		}
	})";

	Json::Value root;
	JsonParse::JsonParseFromString(rawJson, &root);
	const std::string source_ip = root["source_ip"].asString();
	std::cout << source_ip << std::endl;
	const std::string event = root["payload"]["event"].asString();
	Json::Value array = root["payload"]["image_list"];
	for (int i = 0;i < array.size();i++) {
		std::cout << "url: "<< array[i]["url"].asString() << " timestamp:" << array[i]["timestamp"].asInt64() << std::endl;
	}
	return EXIT_SUCCESS;
}

数组遍历支持C++11 写法:

Json::Value array = root["payload"]["image_list"];
for (const auto &item : array) {
	std::cout << "url: "<< item["url"].asString() << " timestamp:" << item["timestamp"].asInt64() << std::endl;
}

demo4 不知道key的时候遍历

      Json::Value objects;
      ....
      Json::Value::Members mem = objects.getMemberNames();
      for (auto iter = mem.begin(); iter != mem.end(); iter++) {
        config_map[*iter] = objects[*iter].asString();
      }
奇妙之二进制 CSDN认证博客专家 嵌入式优质创作者
专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏,也可以关注二进制人生公众号。
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值