一个用C++写的Json解析与处理库

以下转自:http://blog.csdn.net/ggicci/article/details/10600403什么是Json?这个库能做什么?
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write.
Json 是一种轻量的数据交换格式,和 XML 一样在 Web 开发中非常常用。在 Ajax 的应用中,前台基本上会用到 JSON 作为数据交换格式,因为在 JS 里面可以通过 JSON.parse() 函数对 JSON 格式的字符串进行解析得到 JS 对象,通过这个 JS 对象可以轻松地获取和修改里面的数据。而这个库 ggicci::Json 可以像 JS 一样通过解析获得一个类似的 C++ 对象。通过这个 C++ 对象,你可以像使用 JS 一样对数据进行获取和修改,语法上基本类似。只不过 C++ 是强类型语言,所以当你在试图用不一样的数据类型去获取里面的值的时候会抛异常。至于 C++ 是否需要 JSON 解析器,答案是肯定的,比如某个 CS 架构的程序,服务器端有某些页面采用 web 技术输出 JSON 数据,客户端是 C++ 客户端,它向这些页面发送 HTTP 请求并接收到 JSON 数据,这些数据就需要解析以配合客户端的使用。当然除非客户端只是输出这些字符串或者客户端采用与 C++ 与 JS 混合编程方式,让 JS 去处理这些数据。

项目地址和文档
Github:https://github.com/ggicci/ggicci--json
GGICCI:http://ggicci.me/works/json
文档:http://ggicci.me/works/json/doc
看一个简单例子
#include <iostream>
#include "gci-json.h"  

using namespace std;
using namespace ggicci;  

int main(int argc, char const *argv[])
{
    // Parse a string to get a Json object
    Json json = Json::Parse("{          \
        \"id\": 18293,                  \
        \"name\": \"Ggicci\",           \
        \"birthday\": [1991, 11, 10],   \
        \"man\": true                   \
    }");  

    cout << "json = " << json << endl;
    cout << "-----------------------" << endl;
    cout << "id: " << json["id"] << endl;
    cout << "name: " << json["name"] << endl;
    cout << "birthday-year: " << json["birthday"][0] << endl;
    cout << "birthday-month: " << json["birthday"][1] << endl;
    cout << "birthday-day: " << json["birthday"][2] << endl;
    cout << "man: " << boolalpha << json["man"] << endl;
    cout << "-----------------------" << endl;  

    json["name"] = "Mingjie Tang";
    // add property: method 1
    json["school"] = "Northwest A&F University";
    // add property: method 2
    json.AddProperty("traits", Json::Parse("[]").Push("sympathetic").Push("independent"));
    cout << "json = " << json << endl;
    cout << "-----------------------" << endl;  

    json["birthday"].Remove(0);
    json.Remove("id").Remove("school");
    cout << "json = " << json << endl;  

    return 0;
}  

/*
output:
-----------------------
id: 18293
name: "Ggicci"
birthday-year: 1991
birthday-month: 11
birthday-day: 10
man: true
-----------------------
json = { "birthday": [ 1991, 11, 10 ], "id": 18293, "man": true, "name": "Mingjie Tang", "school": "Northwest A&F University", "traits": [ "sympathetic", "independent" ] }
-----------------------
json = { "birthday": [ 11, 10 ], "man": true, "name": "Mingjie Tang", "traits": [ "sympathetic", "independent" ] }
*/  

如果你对 JSON 的处理比较熟悉(你可能会使用 JS 处理 JSON 数据),你会发现上面的代码很好理解。

与 JS 的使用比较(语法层面上)

对于原始的 JSON 字符串 str: { "id": 1000, "name": "ggicci", "birthday": [1991, 11, 10] }

JS: var str = ‘{ "id": 1000, "name": "ggicci", "birthday": [1991, 11, 10] }‘;

C++: const char* str = "{\"id\": 1000, \"name\": \"ggicci\", \"birthday\": [1991, 11, 10] }";

ggicci::Json 和 JS 中 JSON 的使用比较
功能 JS 的 JSON 解析器 ggicci::Json(下面假设已声明使用命名空间 ggicci)
解析并得到JSON对象 var json = JSON.parse(str); Json json = Json::Parse(str);
获取Number var id = json["id"]; int id = json["id"];
获取String var name = json["name"]; const char* name = json["name"];
string name = json["name"];
获取Array var birthday = json["birthday"]; Json birthday = json["birthday"]; // 拷贝
Json &birthday = json["birthday"]; // 引用
Json *birthday = json["birthday"]; // 指针
ggicci::Json 中获取 null(需要通过 Json 对象,IsNull() 函数用来确定接收到的数据是否是 null) 获取Object(需要通过 Json 对象) 获取true,false(通过 bool 值就可以了)
修改Number json["id"] = 19214; json["id"] = 19214;
修改String json["name"] = "Mingjie Tang"; json["name"] = "Mingjie Tang";
修改Array json["birthday"][2] = 11; json["birthday"][2] = 11;
添加数据(Array) json["birthday"].push(2013);
json["birthday"].push("hello");
json["birthday"].Push(2013).Push("hello");
添加数据(Object) json["man"] = true; json["man"] = true;
json.AddProperty("man", true);
删除数据(Array) use pop, unshift ... json["birthday"].Remove(0); // 不能级联
删除数据(Object) delete json["name"]; json.Remove("name").Remove("id"); // 可以级联
获取Object的所有Keys // 复杂 vector<string> keys = json.Keys();

异常处理
解析异常

int main(int argc, char const *argv[])
{
    try
    {
        Json json = Json::Parse("[1, 2, 2, { \"id\": 183, \"name\": ‘Ggicci‘ } ]");
    }
    catch (exception& e)
    {
        cout << e.what() << endl; // SyntaxError: Unexpected token ‘ at pos 31
    }
    return 0;
}
在 Chrome 下利用 JS 的 JSON::parse() 函数解析抛出的异常:

数据获取异常

int main(int argc, char const *argv[])
{
    try
    {
        Json json = Json::Parse("[1, 2, 3, 4]");
        int first = json[0]; // no problem
        const char* second = json[1]; // cause exception
    }
    catch (exception& e)
    {
        cout << e.what() << endl; // OperationError: Illegal extract opeartion from Number to String
    }
    return 0;
}
非法操作异常
[cpp] view plain copy
int main(int argc, char const *argv[])
{
    try
    {
        Json json = Json::Parse("[1, 2, 3, 4]");
        json.AddProperty("name", "Ggicci"); // cause exception
    }
    catch (exception& e)
    {
        cout << e.what() << endl; // OperationError: Illegal add property opeartion on Array
    }
    return 0;
}
类型检测
[cpp] view plain copy
int main(int argc, char const *argv[])
{
    Json json = Json::Parse("[1, \"hello\", { \"title\": null }, false ]");
    json.IsArray();     // true
    json[0].IsNumber(); // true
    json[1].IsString(); // true
    json[2].IsObject(); // true
    json[2]["title"].IsNull();  //true
    json[3].IsBool();   // true  

    if (json.IsArray())
    {
        for (int i = 0; i < json.Size(); ++i)
        {
            switch (json[i].DataKind())
            {
                case Json::kNumber: cout << "number: "; break;
                case Json::kString: cout << "string: "; break;
                case Json::kArray:  cout << "array:  "; break;
                case Json::kObject: cout << "object: "; break;
                case Json::kBool:   cout << "bool:   "; break;
                case Json::kNull:   cout << "null:   "; break;
                default: break;
            }
            cout << json[i] << endl;
        }
    }
    return 0;
}  

/*
output:
number: 1
string: "hello"
object: { "title": null }
bool:   false
*/  
时间: 2024-11-05 06:41:58

一个用C++写的Json解析与处理库的相关文章

cJSON: 一个用c写的一个简单好用的JSON解析器

转自:http://blog.csdn.net/chenzhongjing/article/details/9188347 下载地址: http://sourceforge.net/projects/cjson/files/?source=navbar 实例1: 创建一个简单的学生信息数组 cJSON* pRoot = cJSON_CreateObject(); cJSON* pArray = cJSON_CreateArray(); cJSON_AddItemToObject(pRoot, "

一起写一个JSON解析器

[本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指正:)] 一.JSON解析器介绍 相信大家在平时的开发中没少与JSON打交道,那么我们平常使用的一些JSON解析库都为我们做了哪些工作呢?这里我们以知乎日报API返回的JSON数据来介绍一下两个主流JSON解析库的用法.我们对地址 http://

Java基础知识强化103:JSON解析框架汇总

1.Gson Gson是Google提供的一个能够将Java对象转换成相应JSON表达形式的一个开源Java类库,当然用Gson也能将JSON字符串转换成与之等价的Java对象.Gson对于任何Java对象都有效,包括那些预先存在没有源代码的对象. 现在已经有一些能将Java对象转换成JSON的开源项目了.但是大多数项目都要求你在类文件中加入Java注解,而当你无法改动源代码的时候这是无法做到的.并且它们也不支持Java泛型.但是Gson却将这两点作为自己非常重要的设计目标. 目标 使用toJs

高性能JSON解析器及生成器RapidJSON

RapidJSON是腾讯公司开源的一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API. 直击现场 RapidJSON是腾讯公司开源的一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API. 项目源码地址: Github托管:https://github.com/TencentOpen/rapidjson CODE托管:https://code.csdn.net/Tencent/rapidjson RapidJSON的灵感来自RapidXml,它

Json解析工具Jackson(简单应用)

概述    Jackson库(http://jackson.codehaus.org),是基于Java语言的开源json格式解析工具,整个库(使用最新的2.2版本)包含3个jar包:    jackson-core.jar--核心包(必须),提供基于"流模式"解析的API.    jackson-databind--数据绑定包(可选),提供基于"对象绑定"和"树模型"相关API.    jackson-annotations--注解包(可选),提

自己动手实现一个简单的JSON解析器

1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 web 应用开发领域内,得益于 JavaScript 对 JSON 提供的良好支持,JSON 要比 XML 更受开发人员青睐.所以作为开发人员,如果有兴趣的话,还是应该深入了解一下 JSON 相关的知识.本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析器的解析流

面试题|手写JSON解析器

这周的 Cassidoo 的每周简讯有这么一个面试题:: 写一个函数,这个函数接收一个正确的 JSON 字符串并将其转化为一个对象(或字典,映射等,这取决于你选择的语言).示例输入: fakeParseJSON('{ "data": { "fish": "cake", "array": [1,2,3], "children": [ { "something": "else&qu

如何编写一个JSON解析器

编写一个JSON解析器实际上就是一个函数,它的输入是一个表示JSON的字符串,输出是结构化的对应到语言本身的数据结构. 和XML相比,JSON本身结构非常简单,并且仅有几种数据类型,以Java为例,对应的数据结构是: "string":Java的String: number:Java的Long或Double: true/false:Java的Boolean: null:Java的null: [array]:Java的List<Object>或Object[]: {"

js中解析json对象:JSON.parse()用于从一个字符串中解析出json对象, JSON.stringify()用于从一个对象解析出字符串。

JSON.parse()用于从一个字符串中解析出json对象. var str = '{"name":"huangxiaojian","age":"23"}' ; JSON.parse(str); // age: "23" name: "huangxiaojian" 2.JSON.stringify()用于从一个对象解析出字符串. var a = {a:1,b:2 }; JSON.str