您当前的位置: 首页 >  json

wendy_ya

暂无认证

  • 1浏览

    0关注

    342博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++数据交换格式库jsoncpp安装与使用详解

wendy_ya 发布时间:2022-03-14 21:51:00 ,浏览量:1

目录
    • 一、json介绍
      • 1.1 pair
      • 1.2 object
      • 1.3 array
    • 二、jsoncpp库
    • 三、jsoncpp库下载、安装与使用
    • 四、jsoncpp常用类
      • 4.1 Json::Value
      • 4.2 Json::Reader
      • 4.3 Json::Writer
    • 五、代码示例
    • 六、代码示例汇总
      • 6.1 示例1:从文件中读取json文件并解析
      • 6.2 示例2:从内存中读取json数据(object)
      • 6.3 从内存中解析json数据(array)
      • 6.4 简单json数据封装
      • 6.5 json封装-内嵌array的object
      • 6.6 json封装-内嵌object的array

一、json介绍

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。

JSON建构于两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。【name->value】
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

JSON具有以下这些形式: 对象是一个无序的“‘名称/值’对”集合。一个对象以 {左括号 开始, }右括号 结束。每个“名称”后跟一个 :冒号 ;“‘名称/值’ 对”之间使用 ,逗号 分隔。

1.1 pair

先从键值对(pair)开始,一个pair的通常结构是: key:value 键值之间的对应关系使用:表示,左边的为name,右边的为value。 一般key使用字符串,当然也可以使用数字,但是不推荐。 value的取值就比较随便,可以是任何任何json支持的类型(比如object,array,string,number,true/false,null等)。

1.2 object

object可以认为是多个pair的集合。 其语法是以{作为object开始,以}作为object结束,不同的pair之间使用,分割。 需要说明的是object中的数据存储是无序的。 示例:

{
"name" : "tocy",
"age" : 1000
}
1.3 array

array是value的有序集合。 其语法是以[作为array起始,以]作为array结束,array元素之间使用,分割。 实际使用中建议在array中使用统一的类型,否则解析起来会麻烦点。 比如下面语法是合法的:

[{"name":"tocy"}, {"age":1000}, {"domain":"cn"}]

参考链接:http://www.json.org/json-zh.html

二、jsoncpp库

我们都知道由于Json语法是 JavaScript 对象表示语法的子集。所以在Java,JavaScript等语言中使用起来是十分愉快的。在C++中我们使用跨平台的开源库JsonCpp也能愉快的玩耍Json。 JsonCpp 是一个C++库,允许操作 JSON 值,包括序列化和反序列化到字符串和从字符串反序列化。它还可以在非序列化/序列化步骤中保留现有注释,使其成为存储用户输入文件的便捷格式。

三、jsoncpp库下载、安装与使用

jsoncpp下载链接:https://github.com/open-source-parsers/jsoncpp

解压上面下载的jsoncpp-master.zip文件,把jsoncpp-master\include\json文件夹和jsoncpp-master\src\lib_json文件夹里的全部文件拷贝到工程目录下,并且添加到到VS工程中。 在需要使用JsonCpp的文件中包含json头文件即可,如:#include “json/json.h”。

四、jsoncpp常用类

在这里插入图片描述

4.1 Json::Value

Json::Value:可以表示所有支持的类型,如:int , double ,string , object, array等。其包含节点的类型判断(isNull,isBool,isInt,isArray,isMember,isValidIndex等),类型获取(type),类型转换(asInt,asString等),节点获取(get,[]),节点比较(重载=,==,!=),节点操作(compare,swap,removeMember,removeindex,append等)等函数。

4.2 Json::Reader

Json::Reader:将文件流或字符串创解析到Json::Value中,主要使用parse函数。Json::Reader的构造函数还允许用户使用特性Features来自定义Json的严格等级。

4.3 Json::Writer

Json::Writer:与JsonReader相反,将Json::Value转换成字符串流等,Writer类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter(将数据写入一行,没有格式),Json::StyledWriter(按json格式化输出,易于阅读)。 Json::Reader可以通过对Json源目标进行解析,得到一个解析好了的Json::Value,通常字符串或者文件输入流可以作为源目标。

参考链接:http://jsoncpp.sourceforge.net/annotated.html

五、代码示例

创建一个json,命名为checkjson.json:

[
 { "name": "json",
  "lines": 
   [
    { "line": "1" },
    { "line": "2" },
    { "cpp": "jsoncpp" },
    { "java": "jsoninjava" },
    { "php": "support" }
   ]
 },
 { "name": "c++",
  "lines": 
   [
    { "line": "3" },
    { "line": "4" },
    { "cpp": "jsoncpp" },
    { "java": "jsoninjava" },
    { "php": "nosupport" }
   ]
 }
]

cpp代码如下:

#include 
#include 
#include 
#include "json/json.h"

using namespace std;
using namespace Json;

void main()
{
    //读取json文件
    fstream ofile("checkjson.json");
    string strjson;
    if (!ofile.is_open()) {
        return;
    }

    string strline;
    while (getline(ofile, strline)) {
        strjson += strline;
    }
    ofile.close();

    Json::Reader reader;  // 读取器
    Json::Value root;    // Value的值可以是任一对象

    if (reader.parse(strjson, root)) {

        int size = root.size();   // 根结点个数

        for (int j = 0; j             
关注
打赏
1659256378
查看更多评论
0.0432s