RapidJSONのいくつかの操作しやすいマクロ定義

3119 ワード

以前はCCJsonConventerを使ってJSON文字列をCCDictionaryオブジェクトに変換していましたが、現在はcococos 2 d-x 3.xを使っているのでCCDictionaryはお勧めできません.また、JSONライブラリもrapidjsonに変更されていますが、私はしばらく良いパッケージが見つかりませんでした.
/*
 * =====================================================================================
 *
 *       Filename:  RapidJsonMacro.h
 *
 *    Description:  Easy macro to operate RapidJSON
 *
 *        Version:  1.0
 *        Created:  12/26/2014 11:38:23
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Jason Tou (), [email protected]
 *   Organization:  
 *
 * =====================================================================================
 */

#pragma once

#include "json/rapidjson.h"
#include "json/document.h"

//        
#define json_check_is_bool(value, strKey) (value.HasMember(strKey) && value[strKey].IsBool())
#define json_check_is_string(value, strKey) (value.HasMember(strKey) && value[strKey].IsString())
#define json_check_is_int32(value, strKey) (value.HasMember(strKey) && value[strKey].IsInt())
#define json_check_is_uint32(value, strKey) (value.HasMember(strKey) && value[strKey].IsUint())
#define json_check_is_int64(value, strKey) (value.HasMember(strKey) && value[strKey].IsInt64())
#define json_check_is_uint64(value, strKey) (value.HasMember(strKey) && value[strKey].IsUint64())
#define json_check_is_float(value, strKey) (value.HasMember(strKey) && value[strKey].IsFloat())
#define json_check_is_double(value, strKey) (value.HasMember(strKey) && value[strKey].IsDouble())

#define json_check_is_number(value, strKey) (value.HasMember(strKey) && value[strKey].IsNumber())
#define json_check_is_array(value, strKey) (value.HasMember(strKey) && value[strKey].IsArray())

//          ,               
#define json_check_bool(value, strKey) (json_check_is_bool(value, strKey) && value[strKey].GetBool())
#define json_check_string(value, strKey) (json_check_is_string(value, strKey) ? value[strKey].GetString() : "")
#define json_check_int32(value, strKey) (json_check_is_int32(value, strKey) ? value[strKey].GetInt() : 0)
#define json_check_uint32(value, strKey) (json_check_is_uint32(value, strKey) ? value[strKey].GetUint() : 0)
#define json_check_int64(value, strKey) (json_check_is_int64(value, strKey) ? ((value)[strKey]).GetInt64() : 0)
#define json_check_uint64(value, strKey) (json_check_is_uint64(value, strKey) ? ((value)[strKey]).GetUint64() : 0)
#define json_check_float(value, strKey) (json_check_is_float(value, strKey) ? ((value)[strKey]).GetFloat() : 0)
#define json_check_double(value, strKey) (json_check_is_double(value, strKey) ? ((value)[strKey]).GetDouble() : 0)

//   Value  
#define json_check_value_ptr(value, strKey) (((value).HasMember(strKey)) ? &((value)[strKey]) : nullptr)

文字列を取得するなど、使用も簡単です.
void getName(const rapidjson::Value& data)
{
    std::string strName = json_check_string(data, "name");
}
ただし、ここでは読み取り専用のデータを羅列した操作だけで、書き込み操作はまだ行われていません.jsonデータはクライアントで解析する操作が多いようですが、後で使ってまとめましょう.