当前位置: 首页 > 工具软件 > JSON Spirit > 使用案例 >

JSON-spirit用法

冀崇凛
2023-12-01

在阅读BCOS源码的过程中,发现对于json文件的解析和生产,BCOS源码里有json-spirit库,这是一个c++的json库,所以专门去看了一下,在这里总结用法,附上我找的资料来源,本文主要是对这个的学习
https://www.codeproject.com/Articles/20027/JSON-Spirit-A-C-JSON-Parser-Generator-Implemented
1.首先介绍一下json,它是一种轻量级的数据交换格式,这种格式用来存储和表示数据,并且理论上是独立于编程语言的,json的教程很多,大多数都顺便介绍了JavaScript,附上一个我认为可以快速入门的json教程
http://www.w3school.com.cn/json/index.asp
2.BCOS使用json-spirit来解析和生产json流或json文件,
这个库定义了一个value类,这个类就是你要读的json,直接调用合适的get函数就可以读到json的值,json的值可能是数字,字符串,对象,数组等;必须根据具体的对象不同选择合适的get函数。如:
int i = value_1.get_value< int >();
一般来讲,读取到的往往是一个数组或着对象,数组和对象的数据是放在vector容器中的:
typedef std::vector< Pair > Object;
typedef std::vector< Value > Array;

其中pair的结构如下:

struct Pair
{
    Pair( const std::string& name, const Value& value );

    bool operator==( const Pair& lhs ) const;

    std::string name_;
    Value value_;
};

可以看出在这俩种类型中又使用了value本身,那么它们也可以再包含数组或对象
3.怎么读json呢?
从流或字符串读,读到的东西当然是保存在value中

bool read( const std::string&  s, Value& value );
bool read( std::istream&  is,     Value& value );

使用迭代器

bool read( std::string::const_iterator& begin,
           std::string::const_iterator  end, Value& value );

前面谈到如果json的值是数组或对象的话,它本身还可以再包含数组或对象,读函数一次只能读一层,如果要向里读的话必须自己设计逻辑。
4.怎么写json呢?
来自官方的小例子:

Object addr_obj;
addr_obj.push_back( Pair( "house_number", 42 ) );
addr_obj.push_back( Pair( "road",         "East Street" ) );
addr_obj.push_back( Pair( "town",         "Newtown" ) );
ofstream os( "address.txt" );
write( addr_obj, os, pretty_print );
os.close();

object类型是指json object;pair类型上面说过了,最后生成的文件如下:

{
    "house_number" : 42,
    "road" : "East Street",
    "town" : "Newtown"
}

注意write函数,既可以将之写入到字符串也可以写入到文件:

std::string write( const Value&  value, Output_options options = none, unsigned int precision_of_doubles = 0 );
void write( const Value& value, std::ostream&  os, Output_options options = none, unsigned int precision_of_doubles = 0 );

options是一个控制参数,具体看文档吧,不那么重要
5.出错怎么办?
如果出错或抛出一个异常,告诉你在哪行哪列json格式有问题:

struct Error_position
{
    ...
    unsigned int line_;
    unsigned int column_;
    std::string reason_;
};

BCOS使用的json-spirit版本是4.03,所以4.05以上的高级版本才有的功能我就不看了;这样这个库的基本用法就已经知道了,至于BCOS里是怎么用的,我将另外说明。

 类似资料: