C++解析JSON(jsonCpp)

C++解析JSON(jsonCpp)

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

这里我们主要使用jsoncpp来解析json文件的

准备工作

下载jsonCpp

我们首先新建一个文件夹jsonCpp,然后将jsoncpp克隆到我们的文件夹下面:

>mkdir jsonCpp && cd jsonCpp

>git clone https://github.com/open-source-parsers/jsoncpp.git

现在你的文件夹下面就会有一个jsoncpp文件夹,这里面就是jsoncpp的源码

编译jsoncpp

面对这个多个文件和文件夹,是不是有点混乱了,但是我们用到的东西就只有两个文件夹,一个是src/lib_json文件夹,一个是include/json文件夹

于是新建一个目录,并将这两个文件夹复制出来,将json文件夹复制到lib_json里面

下载我们就需要编译这些文件,并生成静态链接库,其实不编译也行,只是后面用起来方便一点,我们来编辑一个Makefile

TARGET=libjson.lib

SRCS=json_writer.cpp     json_reader.cpp     json_value.cpp
OBJS=$(SRCS:.cpp=.o)
INCS=-I json

$(TARGET):$(OBJS)
    ar rv [email protected] $^

%.o:%.cpp
    g++ -c $< $(INCS) -o [email protected]

make 以后发现报错了

显示错误为:

报错找不到头文件

博主琢磨了一番,发现还是找不到解决方案(对makefile不太熟悉,有大神指点一下么?),只有改源文件了了,于是将json_value.cppjson_reader.cpp,json_write.cpp这三个文件里面的头文件的尖括号改为双引号,然后make编译成功。

读取JSON文件

我们得到了jsonCpp的静态链接库libjson.lib,接下面我们开始用jsoncpp解析json文件了

从上面的编译可知,jsoncpp里面大致包含三个类:

  • Json::Value 用来保存读取的数据或者将要写入文件的数据
  • Json::Reader 用来读取JSON文件里面的数据,并传入到Json::Value对象里面去
  • Json::FastWriter 用来将Json::Value对象写入到一个JSON文件中去

读取简单的JSON文件

include <fstream>
#include <cassert>
#include "json/json.h"
#include <iostream>

using namespace std;

int main()
{
    ifstream inFile("test.json", ios::in);
    if(!inFile.is_open())
    {
        cerr<<"Open the file failed"<<endl;
        return -1;
    }

    Json::Value root;
    Json::Reader reader;
    if(!reader.parse(inFile , root , false))
    {
        cerr<<"parse file failed"<<endl;
        return -1;
    }

    cout<<"name : "<<root["name"].asString()<<endl;
    cout<<"age : "<<root["age"].asInt()<<endl;
    return -1;
}

test.json里面的数据为:

{
    "name":"qeesung",
    "age":21
}

我们编译一下:g++ main.cpp libjson.lib -o myJson

运行结果为:

读取含有数组的JSON文件

#include <fstream>
#include <cassert>
#include "json/json.h"
#include <iostream>

using namespace std;

int main()
{
    ifstream inFile("test.json", ios::in);
    if(!inFile.is_open())
    {
        cerr<<"Open the file failed"<<endl;
        return -1;
    }

    Json::Value root;
    Json::Reader reader;
    if(!reader.parse(inFile , root , false))
    {
        cerr<<"parse file failed"<<endl;
        return -1;
    }
    for(int i = 0 ; i<root.size(); ++i)
    {
        cout<<"name : "<<root[i]["name"].asString()<<endl;
        cout<<"age : "<<root[i]["age"].asInt()<<endl;
    }
    return -1;
}

json文件为:

[
    {"name":"qeesung1","age":21},
    {"name":"qeesung2","age":22},
    {"name":"qeesung3","age":23},
    {"name":"qeesung4","age":24}
]

编译运行结果为:

写入数据到SON文件中

#include <fstream>
#include <cassert>
#include "json/json.h"
#include <iostream>
using namespace std;
int main()
{
    ofstream outFile("test.json", ios::out | ios::trunc);
    if(!outFile.is_open())
    {
        cerr<<"Open the file failed"<<endl;
        return -1;
    }

    Json::Value root;
    Json::FastWriter writer;
    for(int k = 0 ; k < 3 ; ++k)
    {
        root[k]["root"]="qeesung";
        root[k]["age"]=k+10;
    }
    string str = writer.write(root);
    outFile<<str;
    return -1;
}

我们得到结果:

[{"age":10,"root":"qeesung"},{"age":11,"root":"qeesung"},{"age":12,"root":"qeesung"}]
时间: 2024-10-22 00:05:28

C++解析JSON(jsonCpp)的相关文章

C++ 解析Json——jsoncpp

Jsoncpp是个跨平台的开源库,下载地址:http://sourceforge.net/projects/jsoncpp/,我下载的是v0.5.0,压缩包大约104K. 方法一:使用Jsoncpp生成的lib文件 解压上面下载的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用VS2008版本编译,默认生成静态链接库. 在工程中引用,只需要包含include/json下的头文件及生成的.lib文件即可. 如何包含lib文件

C++ Jsoncpp源代码编译与解析Json

1.Json 数据表示方式介绍 这个可以看之前的一个文章里面有说明:Java解析(读取)Json数据 2.C++ Jsoncpp 2.1 Jsoncpp介绍 (1)JsonCpp主要包含三种类型的class:Value Reader Writer; Json::Value 是jsoncpp 中最基本.最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见 Json::ValueType 枚举值. Json::Reader 是用于读取的,说的确切点,是用于将字符串转换为 Json:

Boost property_tree解析json

使用Boost property_tree解析json 之前使用jsoncpp解析json,现在才知道boost就有解析的库,学习一下吧 property_tree可以解析xml,json,ini,info等格式的数据,用property_tree解析这几种格式使用方法很相似. 解析json很简单,命名空间为boost::property_tree,reson_json函数将文件流.字符串解析到ptree,write_json将ptree输出为字符串或文件流.其余的都是对ptree的操作. 解析

利用fastjson解析json并通过js&amp;ajax实现页面的无跳转刷新

1.json是一种优秀的数据格式,在移动开发和web开发中经常用到,本例中通过一个小案例讲解如何通过alibaba的开源框架fastjson来解析jason数据格式并通过js实现无跳转刷新 2,新建一个web项目,这是我的项目:我这里直接用servlet写的 注意导包,我这里到了很多无用的包,其实主要的包是下面几个: 这个三个包是必须的,其他都是开发基本web的常用包 3.创建一个domain: package com.keson.domain; import com.thoughtworks.

android之GSON解析JSON

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库. 比如: <pre name="code" class="java">public class Order { public String id; public String OrderName; @Override public String toString() { return "id:"+id+",OrderNa

C# 解析 json

C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的文本格式,可以很容易在各种网络.平台和程序之间传输.JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成. JSON与XML的比较◆可读性 JSON和XML的可读性相比较而言,由于XML提供辅助的标签,更加适合人阅读和理解.◆文件大小与传输 XML允许使用方便的标签,所以文件尺寸是要比J

使用QtScript库解析Json数组例子

本文转载自:http://blog.sina.com.cn/s/blog_671732440100uwxh.html 使用qtscipt库解析json数组首先在工程文件中加 QT        += script 然后头文件加 #include <QtScript> 然后解析 QString str = "{\"name\":\"xiaotang\", \"age\":\"23\", \"chi

C# 解析JSON格式数据

JSON简介 JSON(全称为JavaScript ObjectNotation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集.JSON采用完全独立于语言的文本格式,可以很容易在各种网络.平台和程序之间传输.JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成. JSON与XML的比较 ◆可读性 JSON和XML的可读性相比较而言,由于XML提供辅助的标签,更加适合人阅读和理解. ◆文件大小与传输 XML允许使用方便的标签,所以文件尺寸是要比JSON大

不适用工具类解析Json

解析的数据: { "citycode": "101051301", "citydesc": "黑龙江 双鸭山", "cityname": "双鸭山", "data": [ { "date": "2015-08-29", "icon": "d07|n07", "temperatur