JsonCpp解析简单Json对象
概述
Json格式文本目前主要用于数据交换,相较于xml,Json具有更好地可读性,也更易于编写。同样的表达内容,Json即是全放在同一行也能够清楚地阅读,xml就比较困难了。最近也是在项目中用到了Json作为数据交换的格式,也学习使用了一个Json解析处理的C++库,用起来比较优雅,风格也很符合STL风格,特地记录一下,以后方便查找。
简单的Json格式
简单的Json格式结构如std::map一般,是一种Key-Value的映射关系,即一个Json对象中含有零个或多个的二元组,一个简单的例子如下:
{
"name": "Morris","age": 22 }
对于Json,JavaScript对Json格式原生支持很好,可以和访问基本数据类型一样简单使用。在C++中就比较麻烦了,标准库中并未对Json提供支持,在C++项目中如果使用到Json,找不到合适的第三方库,自己写就很麻烦了。幸好,确实有第三方库实现了很好的支持Json的方式,下面就来说说这个第三方开源库——JsonCpp。
Json::Value
Json中,最重要的概念就是对象,上面的例子中,整体就是一个Json对象,其中的name、age字段则可视为其属性。JsonCpp中,通过特定的方法,可以将文件流或者字符串形式的Json文本构造成Json::Value类型的对象。构造Json::Value对象是为了更方便的操作Json数据,如上面所说,简单的Json格式结构如std::map一般,JsonCpp的实现也让Json::Value具有了和std::map差不多形式的操作方式,如可以通过Key值索引,取得对应的Value,在Json::Value中则是通过字段名,取得对应的值。对于添加Key-Value或字段,两者操作方式同样类似。
Json::Reader
为了构造更方便使用的Json::Value对象,一般使用Json::Reader来构造。Json::Reader可以接收多种格式的数据,并将它们构造成合适的Json::Value对象,比较常见的格式是文件流和字符串。这里可以先给个简单的例子:
std::ifstream ifs;
ifs.open("/Users/Morris/Code/cpp/test/test.json");
Json::Value val;
Json::Reader reader;
if (!reader.parse(ifs,val)) {
return -1;
}
使用例子中的代码,即可将test.json文件中的json文本构造成为Json::Value对象。
Json::Value取值
有了上面简单的了解,这里就可以编写JsonCpp操作Json数据的简单代码了。具体代码如下:
//
// main.cpp
// TestJson
//
// Created by Morris on 2016/11/21.
// Copyright © 2016年 Morris. All rights reserved.
//
#include <iostream>
#include <fstream>
#include <string>
#include <json/json.h>
int main(int argc,const char * argv[])
{
std::ifstream ifs;
ifs.open("/Users/Morris/Code/cpp/test/test.json");
Json::Value val;
Json::Reader reader;
if (!reader.parse(ifs,val)) {
return -1;
}
std::string name = val["name"].asString();
int age = val["age"].asInt();
std::cout << "Name: " << name << std::endl;
std::cout << "Age: " << age << std::endl;
return 0;
}
在使用JsonCpp操作Json数据的过程还有一些需要注意的点,这里就不赘述了,先学会简单的使用方式,后续的使用过程中,会一一提到。