JSON函数表2

[class] Json::Reader
[public]
[将字符串或者输入流转换为JSON的Value对象]
bool parse( const std::string &document, Value &root, bool collectComments = true );
bool parse( const char *beginDoc, const char *endDoc, Value &root,bool collectComments = true );
bool parse( std::istream &is,Value &root,bool collectComments = true ); // 从文件流中读取
// ture success ; false error
[获取满足相应条件的Value]
std::string getFormatedErrorMessages() const;//返回成员命名的关键如果它存在,否则defaultValue


[class] Json::Value

[注意] Json::Value 只能处理 ANSI 类型的字符串,如果 C++ 程序是用 Unicode 编码的,最好加一个 Adapt 类来适配
[注意] 要取下标为 0 的value值, 只能通过 int i=0;value[i]; 不能是 value[0];
[public]
[获取满足相应条件的Value]
Value get( Uint index, const Value &defaultValue ) const;
Value get( const char *key, const Value &defaultValue) const; //查找是否存在 索引key ,存在则返回其对应的 :value
Value get( const std::string &key, const Value &defaultValue ) const;
例如:
Json::root["one"] = 456;
Json::Value root04 = root.get("one", root);
cout << root04.asUInt() << endl; //456
[Value转基本格式]
Int asInt() const;
UInt asUInt() const; //能不转有符号的int
Int64 asInt64() const;
LargestInt asLargesInt() const;
LargestUInt asLargestUInt() const;
float asFloat() const;
double asDouble() const;
bool asBool() const;
std::string asString() const;
const char* asCString() const;
std::string toStyledString() const; // 可以把整个 value 转为 string 格式
[判断Value格式]
bool isNull() const;
bool isBool() const;
bool isDouble() const;
bool isInt() const;
bool isString() const;
bool isArrar() const;
bool isObject() const;
bool isMember (const char *key) const //Return true if the object has a member named key.
bool isMember (const std::string &key) const //Return true if the object has a member named key.
[相同类型的比较、交换、类型的获取]
int compare( const Value &other ); //比较两个 Value
void swap(Value &other); //交换两个 Value 的内容
ValueType type()const; //Value 的格式
[其他功能]
ArrayIndex size() const; //Number of values in array or object //typedef unsigned int Json::ArrayIndex
Value& append(const Value &value) //append value to < array > at the end;
void clear(); //remove all object members and array elements
void resize(ArrayIndex index); //调整array元素的个数,其他格式无法使用
void empty() const; //Number of values in array or object
Value removeMember(const char* key); //Remove and return the named member
Value removeMember(const std::string &key); //Same as removeMember(const char*).
[勾造函数]
Value (ValueType type=nullValue) Create a default Value of the given type.
Value (Int value)
Value (UInt value)
Value (Int64 value)
Value (UInt64 value)
Value (double value)
Value (const char *value)
Value (const char *beginValue, const char *endValue)
Value (const StaticString &value) Constructs a value from a static string.
Value (const std::string &value)
Value (bool value)
Value (const Value &other)
[迭代器] Json::Value::const_iterator
const_iterator begin () const
const_iterator end () const
iterator begin ()
iterator end ()
//这个迭代器不要使用 != == 进行比较
[操作符比较]
bool operator< (const Value &other) const //类型相等 -> 元素个数相等 -> 比较地址
bool operator<= (const Value &other) const //
bool operator>= (const Value &other) const //
bool operator> (const Value &other) const //
bool operator== (const Value &other) const //类型不相等返回 0 ,内容一致返回 1
例: char arr[4] = {'1','2','3',''}; string str = "123";
root["one"] == "123";
root["one"] == str;
root["one"] == arr;
root["one"].asString() == arr;
root["one"].asString() == str;
root["one"].asString().c_str() == str.c_str(); //error
bool operator!= (const Value &other) const //类型不相等返回 1 ,内容一致返回 0
比较类型,类型相等->比较元素个数,个数相等->比较元素值
(2) 数组访问
Json::Value //格式如下
[["key1":value1],["key2":value2]]

Json::Value::const_iterator iter; //迭代器
for(iter = input.begin(); iter != input.end(); iter++)
Json::Value::Members member=(*iter).getMemberNames();
*(member.begin()); // 输出 key1,key2
(*iter)[*(member.begin())]; //输出 value1,value2

[class] Json::FastWriter

[public]
void enableYAMLCompatibility () //转格式时,是否在 :后面加一空格
virtual std::string write (const Value &root) //把 Value 转为 std::string,不格式化

[class] Json::StyledWriter

是格式化后的json

不支持utf-8格式的输出,需要自己调用writer之后,用iconv转化成utf-8字符串 //见 iconv 文件

[class] Json::Writer

继承 FastWriter StyledWriter, 它是一个虚类


[type]

enum ValueType
{
nullValue = 0, ///< 'null' value
intValue, ///< signed integer value
uintValue, ///< unsigned integer value
realValue, ///< double value
stringValue, ///< UTF-8 string value
booleanValue, ///< bool value
arrayValue, ///< array value (ordered list)
objectValue ///< object value (collection of name/value pairs).
};


----------------------------------------------------------------------------------------------------

1、相关概念总结

(1)解析json的方法

Json::Value json; //表示一个json格式的对象

Json::Reader reader; //json解析

reader.parse(json_buf/*json格式的字符串*/,json,false); //解析出json放到json中

jsoncpp库中的Reader类用来将字串或者流载入解析器。后期可以用Reader里面的解析方法把Json字串解码为C++认识的数据。可以用 Json::Reader来声明一个Reader实例。Reader中最常用的就是一个parse方法,该方法用来将载入的json字串解析为C++格式的数据。

(2) 数组访问

Json::Value //格式如下

[["key1":value1],["key2":value2]]

Json::Value::const_iterator iter; //迭代器

for(iter = input.begin(); iter != input.end(); iter++)

Json::Value::Members member=(*iter).getMemberNames();

*(member.begin()); // 输出 key1,key2

(*iter)[*(member.begin())]; //输出 value1,value2

Value类是库中的核心类,用于存储各样格式的数据,可以包括int,double,short,char *,string,bool,object,array等几乎所有格式的数据。该库的编码和解码的核心功能都是用Value类实现的。就用以上的 Reader的parse方法来说,需要传入一个Value类别的引用值,就是用来存储Json数据的根值,并且可以用这个根值来存取其他的所有值。

(3) 对象访问

直接用 value["key"]即可

(4) 输出json格式串

调用 Json::FastWriter的writer

writer是该库的一个虚类,没有真正的实现encode的功能。需要重载里头的方法来实现真正的encode功能。FastWriter是该库中真正实现encode功能的类,用来实现将Value编码称为Json串。Json::StyledWriter 是格式化后的json。

不支持utf-8格式的输出,需要自己调用writer之后,用iconv转化成utf-8字符串

2、示例代码

1)示例代码1
复制代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <vector>
#include <iostream>
#include "json/json.h"
using namespace std;

typedef struct piece
{
string letter;
string wild;
}piece;

string encode_msg(string token,int game_id,vector<piece> piece_array)
{
//Json::Value root;
Json::Value var;
//apply “token” and “game_id” value to json struct
var["token"] = token;
var["game_id"] = game_id;

Json::Value pieces;//store all pieces
for (int i=0;i < piece_array.size();i++)
{
Json::Value piece_ex;//here it store just one piece
//next 4 lines to apply piece value to json struct
piece_ex["letter"] = piece_array[i].letter;
piece_ex["wild"] = piece_array[i].wild;
//ok,yes we just have apply One piece ,then push back to the array
pieces.append(piece_ex);
}
var["piece_array"] = pieces;//yes,store pieces in var [Value]
//root.append(var);

Json::FastWriter writer;
return writer.write(var);//generate json string:),here all is done
}
int main()
{
piece one, two;
one.letter = "1";
one.wild = "ont";
two.letter = "2";
two.wild = "two";
vector<piece> myp;
myp.push_back(one);
myp.push_back(two);
string ret = encode_msg("mytoken", 123, myp);
cout << ret << endl;
return 1;
}

复制代码

{"game_id":123,"piece_array":[{"letter":"1","wild":"ont"},{"letter":"2","wild":"two"}],"token":"mytoken"}

结果显示

可以看到,直接用wirter输出的json为非格式化的数据,而通过root.toStyledString()后,代码就是格式化的。

2)示例3,来源于官网
复制代码

// Configuration options
{
// Default encoding for text
"encoding" : "UTF-8",

// Plug-ins loaded at start-up
"plug-ins" : [
"python",
"c++",
"ruby"
],

// Tab indent size
"indent" : { "length" : 3, "use_space": true }
}

复制代码


复制代码

Json::Value root; // will contains the root value after parsing.
Json::Reader reader;
bool parsingSuccessful = reader.parse( config_doc, root );
if ( !parsingSuccessful )
{
// report to the user the failure and their locations in the document.
std::cout << "Failed to parse configuration "
<< reader.getFormattedErrorMessages();
return;
}

// Get the value of the member of root named 'encoding', return 'UTF-8' if there is no
// such member.
std::string encoding = root.get("encoding", "UTF-8" ).asString();
// Get the value of the member of root named 'encoding', return a 'null' value if
// there is no such member.
const Json::Value plugins = root["plug-ins"];
for ( int index = 0; index < plugins.size(); ++index ) // Iterates over the sequence elements.
loadPlugIn( plugins[index].asString() );

setIndentLength( root["indent"].get("length", 3).asInt() );
setIndentUseSpace( root["indent"].get("use_space", true).asBool() );

// ...
// At application shutdown to make the new configuration document:
// Since Json::Value has implicit constructor for all value types, it is not
// necessary to explicitly construct the Json::Value object:
root["encoding"] = getCurrentEncoding();
root["indent"]["length"] = getCurrentIndentLength();
root["indent"]["use_space"] = getCurrentIndentUseSpace();

Json::StyledWriter writer;
// Make a new JSON document for the configuration. Preserve original comments.
std::string outputConfig = writer.write( root );

// You can also use streams. This will put the contents of any JSON
// stream at a particular sub-value, if you'd like.
std::cin >> root["subtree"];

// And you can write to a stream, using the StyledWriter automatically.
std::cout << root;

转自:https://www.cnblogs.com/mydomain/archive/2011/11/08/2241654.html

原文地址:https://www.cnblogs.com/gd-luojialin/p/10962994.html