zoukankan      html  css  js  c++  java
  • C++解析Json,使用JsonCpp读写Json数据

    JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。通常用于数据交换或存储。

    JsonCpp是一个基于C++语言的开源库,用于C++程序的Json数据的读写操作。

    JsonCpp是一个开源库

    下载地址:https://github.com/open-source-parsers/jsoncpp

    文档地址:http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html

    使用

    官方提供的集成方案:https://github.com/open-source-parsers/jsoncpp/wiki/Amalgamated

    其中最简单的方法是执行项目根目录中的python脚本,构建头文件和源文件。

    1. 在安装Python环境的控制台中进入jsoncpp项目根目录,

    2. 执行命令:

    python amalgamate.py

    3. 将生成的dist目录拷贝到自己的项目中,其中包源文件jsoncpp.cpp和头文件json.h、json-forwards.h

    基本类和方法

    使用jsoncpp库时需要包含头文件#include <json/json.h>(包含目录根据需要修改)

    方法命名空间:Json

    常用类

    Value:用于存储Json数据

    CharReader:从字符串中读取Json数据的抽象类

    CharReaderBuilder:CharReader类的实现,可以读取标准输入流中的数据

    Demo

    定义Json数据结构,并输出数据

    Json::Value jsonRoot; //定义根节点
    Json::Value jsonItem; //定义一个子对象
    jsonItem["item1"] = "one"; //添加数据
    jsonItem["item2"] = 2;
    jsonRoot.append(jsonItem); 
    jsonItem.clear(); //清除jsonItem
    jsonItem["item1.0"] = 1.0; jsonItem["item2.0"] = 2.0; jsonRoot["item"] = jsonItem; cout << jsonRoot.toStyledString() << endl; //输出到控制台

    将Json写入到文件

    ofstream ofs; //标准输出流
    ofs.open("sample.json"); //创建文件
    ofs << jsonRoot.toStyledString(); //输出
    ofs.close();

    从文件读取Json数据

    ifstream ifs; //标准输入流
    ifs.open("sample.json");
    jsonRoot.clear();
    Json::CharReaderBuilder builder; builder[
    "collectComments"] = false; JSONCPP_STRING errs; if (!parseFromStream(builder, ifs, &jsonRoot, &errs)) //从ifs中读取数据到jsonRoot { return; }

     

    从字符串读取Json数据

    string jsonStr = jsonRoot.toStyledString(); //json字符串
    jsonRoot.clear();
    Json::CharReaderBuilder builder; builder[
    "collectComments"] = false; JSONCPP_STRING errs; Json::CharReader* reader = builder.newCharReader(); if (!reader->parse(jsonStr.data(), jsonStr.data() + jsonStr.size(), &jsonRoot, &errs)) //从jsonStr中读取数据到jsonRoot { return; }

     

    获取Json中的键值对

    for (auto i = 0; i < jsonRoot.size(); i++)//遍历数组[]
    {
        for (auto sub= jsonRoot[i].begin(); sub != jsonRoot[i].end(); sub++)//遍历对象{}
        {
            cout << sub.name() << " : " << jsonRoot[i][sub.name()] << endl; //方法1
    cout << sub.name() << " : "
    << (*sub) << endl; //方法2
    } }
    eg:
    jsonRoot= [ { "item1" : 1, "item2" : 2, }, { "a" : "a", "b" : 2.0, } ]
     
  • 相关阅读:
    python 利用turtle库绘制五角星
    ci框架memcached使用
    pycharm搭建开发配置,远程调试,数据库配置,git配置等
    织梦dedecms后台发布文章提示“标题不能为空”
    mysql revise
    sublime 新手代码提示
    div+css的属性
    css解决IE6,IE7,firefox兼容性问题
    Sublime常用插件
    Dede CMS如何在文章中增加“附件下载”操作说明
  • 原文地址:https://www.cnblogs.com/esCharacter/p/7657676.html
Copyright © 2011-2022 走看看