【JSONCpp】简介及demo

一、JSON简介

JSON

一种轻量级的数据交换格式,易于阅读、编写、解析,全称为JavsScript ObjectNotation。

JSON由两种基本结构组成

①   名字/值 对的集合,可以理解为对象

②   值的组合, 可以理解为数组

示例

string strTemp =
        "{ \"name\" :  \"cuihao\" ,"         " \"age\" : 28 }";

    string strRoot =
        "{ \"key_string\"  :  \"value_string\", "         "  \"key_number\"  :  28, "                       "  \"key_boolean\" :  false,  "                   "  \"key_double\"  :  12.345,  "                  "  \"key_object\"  :  json_temp, "                "  \"key_array\"   :  [\"array_string1\",  \"array_string2\", 12345]}";

二、JSONCPP

1.     JsonCPP简介

jsoncpp是c++解析JSON串常用的解析库之一。其常用的类有:

a)     Json::Value    可以表示里所有的类型,比如int,string,object,array等,其支持的类型可以参考Json:ValueType中的值。

b)     Json::Reader  将json文件流或字符串解析到Json::Value,主要函数有Parse。

c)     Json::Writer   与Json::Reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。

d)     Json::Value::Members主要用于以STL风格解析JSON数组。看过源代码的人已知道,Members其实是typedefvector而已。

在VC中使用JSONCPP

下载源码后,进入D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\makefiles\vs71类似目录用VS打开.sln文件进行编译。

注意:

Debug下可以直接编译

Release下:将lib_json项目属性:配置属性—C/C++--输出文件:汇编输出选择【无列表】,应为为No List。

使用JSONCPP时,添加

头文件目录:D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include

库目录:

Debug: D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\build\vs71\debug\lib_json

#pragma  commebt(lib, “json_vc71_libmtd.lib”) 对应/MDd

Release: D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\build\vs71\release\lib_json

#pragma  commebt(lib, “json_vc71_libmt.lib”)  对应/MT

三、上代码

#include "stdafx.h"
#include <iostream>
#include <string>
#include  <json\json.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{ 

    string strStudent = "{ \"name\" : \"cuishihao\", \"age\" : 28, \"major\" : \"cs\" }";
    //char* strStudent = "{ \"name\" : \"cuishihao\", \"age\" : 28, \"major\" : \"cs\" }";

    Json::Reader reader;
    Json::Value value;
    bool bRet = reader.parse(strStudent, value);
    if (false == bRet)
    {
        cerr << endl << "read value error \n";
        return -1;
    }

    cout << value["name"].asString()<<endl;
    cout << value["age"].asInt()<<endl;
    cout << value["major"].asString()<<endl;

    cout << endl;

    Json::Value json_temp;
    json_temp["name"] = Json::Value("cuihao");
    json_temp["age"] = Json::Value(28);

    Json::Value root;
    root["key_string"] = Json::Value("value_string");
    root["key_number"] = Json::Value(12345);
    root["key_boolean"] = Json::Value(true);
    root["key_double"] = Json::Value(12.345);
    root["key_object"] = json_temp;
    root["key_array"].append("array_string1");
    root["key_array"].append("array_string2");
    root["key_array"].append(12345);
    Json::ValueType type = root.type();

    Json::Value arrValue = root["key_array"];
    for (Json::Value::UInt i = 0; i < arrValue.size(); ++ i)
    {
        if (arrValue[i].isString())
            cout << arrValue[i].asString();

        else if (arrValue[i].isInt())
            cout << arrValue[i].asInt();

        cout << endl;
    }

    cout << endl << "----------------------------------- " <<endl;

    string strTemp =
        "{ \"name\" :  \"cuihao\" ,"         " \"age\" : 28 }";

    string strRoot =
        "{ \"key_string\"  :  \"value_string\", "         "  \"key_number\"  :  28, "                       "  \"key_boolean\" :  false,  "                   "  \"key_double\"  :  12.345,  "                  "  \"key_object\"  :  json_temp, "                "  \"key_array\"   :  [\"array_string1\",  \"array_string2\", 12345]}";

    Json::StyledWriter writer;
    cout << endl << writer.write(root) << endl;

    cout << endl << "----------------------------"<<endl;

    Json::Value::Members members = root.getMemberNames();

    for(Json::Value::Members::const_iterator iter = members.begin();
        iter != members.end();
        ++ iter)
    {
        string strName = *iter; 

        if (root[strName].isInt())
            cout << root[strName].asInt();

        else if (root[strName].isString())
            cout << root[strName].asString();

        else if (root[strName].isDouble())
            cout << root[strName].asDouble();

        else if(root[strName].isBool())
            cout << root[strName].asBool();

        else if(root[strName].isArray())
        {
            for(Json::Value::ArrayIndex i = 0; i < root[strName].size(); ++ i)
            {
                if(root[strName][i].isInt())
                    cout << root[strName][i].asInt();
                else if(root[strName][i].isString())
                    cout << root[strName][i].asString();
                else
                    cout << "others";

                cout << endl;
            }
        }

        else if (root[strName].isObject())
        {
            Json::Value::Members mbs = root[strName].getMemberNames();
            for (Json::Value::Members::const_iterator iter2 = mbs.begin();
                iter2 != mbs.end();
                ++ iter2)
            {
                string strName2 = *iter2;
                if(root[strName][strName2].isInt())
                    cout << root[strName][strName2].asInt();
                else if(root[strName][strName2].isString())
                    cout << root[strName][strName2].asString();
                else
                    cout << "others";

                cout << endl;
            } //for
        } //else if
        else
            cout << "others";

        cout << endl;
    }

    return 0;
}

执行结果

【JSONCpp】简介及demo

时间: 2024-09-30 07:47:53

【JSONCpp】简介及demo的相关文章

国外源码精品-Android-PullToRefresh 简介与DEMO导入

转载地址:http://my.oschina.net/cuitongliang/blog/170708 (一)&&http://my.oschina.net/cuitongliang/blog/170737 (二)PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED 一.介绍 Pull To Refresh Views for Android This project aims to provide a reusable Pull

PyQt5简介及demo

PyQt5说明 pyqt5是一套Python绑定Digia QT5应用的框架.它可用于Python 2和3.本教程使用Python 3.Qt库是最强大的GUI库之一.pyqt5的官方网站http://www.riverbankcomputing.co.uk/news. pyqt5做为Python的一个模块,它有620多个类和6000个函数和方法.这是一个跨平台的工具包,它可以运行在所有主要的操作系统,包括UNIX,Windows,Mac OS.pyqt5是双重许可.开发者可以在GPL和商业许可之

Odata简介和Demo

转:http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html 在SOA的世界中,最重要的一个概念就是契约(contract).在云计算的世界中,有关通信的最重要的概念也是契约.XML具有强大对数据的描述能力,Atom格式和AtomPub都建立在XML之上,在Google和微软的推动下,也已经成为标准.但是,Atom/AtomPub和ODBC/OLEDB这样的真正数据交互协议相比较,还有着根本上的欠缺:缺乏数据类型的具体描述,降低

bluebird-api简介及demo

var Promise = require("bluebird"); var fs = require("fs"); //方法Promise化 var readFileAsync = Promise.promisify(fs.readFile); //.spread([Function fulfilledHandler] [, Function rejectedHandler ]) -> Promise //用法:将结果集拆分 //example Promis

[deviceone开发]-天气demo

一.简介 该demo主要实现定位功能,读取天气信息,语音播报功能.其中定位需要配置key,调试二维码请到论坛中下载! 二.效果图 三.相关讨论 http://bbs.deviceone.net/forum.php?mod=viewthread&tid=850&extra=page%3D1 四.源码地址 https://github.com/do-project/code4do/tree/master/weather_demo 五.更多示例 http://source.deviceone.n

可删除超炫&amp;amp;多种特效的Card视图(改造自cardsui-for-android开源项目),提供DEMO下载

       实例Demo下载地址在本文最后 简介 这个Demo主要是使用了cardsui-for-android开源项目,而且做了一些优化和改进: 1.自己定义card视图 2.加入长按事件.避免误操作 3.长按后能够删除card,并播放选中动画 4.删除后浮现一个悬浮button 5.点击悬浮button能够恢复之前删除的card视图 看内容前强烈建议先阅读下面的两篇文章,由于这个demo是在这两个文章的基础上写的: 关于cardsui-for-android这个开源项目的介绍和实现请看这篇

Jsoncpp Compiler、Programming

catalog 1. C++ jsoncpp简介 2. Jsoncpp的下载与编译 3. Linux Jsoncpp的SDK编译 & 简单实例 4. Windows Jsoncpp的SDK编译 & 简单实例 1. C++ jsoncpp简介 jsoncpp是c++解析JSON串常用的解析库之一.其常用的类有 1. Json::Value: jsoncpp中最基本.最重要的类,用于表示各种类型的对象,jsoncpp支持的对象类型可见Json::ValueType枚举值 2. Json::Re

轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)

在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Header)和消息体(Body)构成的,消息头的长度固定,而且,通过解析消息头,可以知道消息体的长度.如此,我们便可以从网络流中解析出一个个完整的二进制消息. 两种类型的协议格式各有优劣:文本协议直观.容易理解,但是在文本消息中很难嵌入二进制数据,比如嵌入一张图片:而二进制协议的优缺点刚刚相反. 在 轻量

轻量级通信引擎StriveEngine —— C/S通信demo(附源码)

前段时间,有几个研究ESFramework的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点"杀鸡用牛刀"的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关系.也不存在组广播.不需要服务器均衡.不需要跨服务器通信.甚至都不需要使用UserID,只要客户端能与服务端进行简单的稳定高效的通信就可以了.于是,他们建议我,整一个轻量级的通信组件来满足类似他们这种项目的需求.我觉得这个建议是有道理的,于是,花了几天时间,我将ESFramework的内核抽离出来