青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

使用jsoncpp封裝的Json序列化和反序列化的工具類

C++序列化和反序列化json需要寫的代碼實(shí)在是太多了,太過于臃腫了.
相比較其他的語言,如:js,php等.如果在其他語言里面用過json,再在c++里面來使用,那種感覺會(huì)是非常無奈的,而且抗拒的.
怎么說呢,勉強(qiáng)的還是能用的吧.湊合用吧.

JsonSerializer.h
/**********************************************************************
* Copyright (C) 2015 - tx7do - All Rights Reserved
*
* 文件名稱:        JsonSerializer.h
* 摘    要:        Json序列化工具
*
* 作    者:        yanglinbo, 
* 修    改:        查看文件最下方.

**********************************************************************
*/

#ifndef __JsonSerializer_H__
#define __JsonSerializer_H__


#include <assert.h>
#include <vector>
#include <json/json.h>


typedef signed __int8           int8;
typedef unsigned __int8         uint8;
typedef signed __int16          int16;
typedef unsigned __int16        uint16;
typedef signed __int32          int32;
typedef unsigned __int32        uint32;
typedef signed __int64          int64;
typedef unsigned __int64        uint64;


class JsonSerializer
{
public:
    JsonSerializer();
    virtual~JsonSerializer();

    JsonSerializer& operator=(const JsonSerializer& other)
    {
        return *this;
    }

public:
    /// 序列化
    virtual const char* serialized() = 0;

    /// 反序列化
    virtual bool deserialize(const char* data, size_t size) = 0;

public:
    /// 清除緩存
    void clearBuffer();

    void resetReadPos() { readPos = 0; }
    void resetWritePos() { writePos = 0; }
    void resetPosition() { resetReadPos(); resetWritePos(); }

    /// 刷新json字符串
    const char* flush();

    /// 刷新成風(fēng)格化的json字符串
    const std::string& style_flush();

    /// 是否具有該鍵
    bool isKeyValid(const std::string& key) const;
    bool isKeyValid(const char* key) const;

    /// 獲取json字符串
    const std::string& getString() const { return document; }

public:
    /// 當(dāng)開關(guān)打開的時(shí)候,所有的數(shù)據(jù)序列化為數(shù)組.
    void toArray() { bToArray = true; }

    /// 當(dāng)開關(guān)打開的時(shí)候,序列化的json字符串將被zip壓縮.解序列化之前,將會(huì)被zip解壓縮.
    void enableZip() {  bEnableZip = true; }

public:
    void append(const std::string& key, const int8& value);

    void append(const std::string& key, const int16& value);

    void append(const std::string& key, const int32& value);

    void append(const std::string& key, const int64& value);

    void append(const std::string& key, const uint8& value);

    void append(const std::string& key, const uint16& value);

    void append(const std::string& key, const uint32& value);

    void append(const std::string& key, const uint64& value);

    /// 
    void append(const std::string& key, const float& value);

#ifdef _VECTOR_
    template <typename T>
        void append(const std::string& key, const std::vector<T>& value)
    {
        Json::Value arrayObj;

        if (!value.empty())
        {
            typename std::vector<T>::const_iterator iter    = value.begin();
            typename std::vector<T>::const_iterator& iEnd    = value.end();
            for (; iter != iEnd; ++iter)
            {
                arrayObj.append( *iter );
            }
        }
        else
        {
            arrayObj.resize(0);
        }

        if (bToArray || key.empty())
        {
            root.append(arrayObj);
        }
        else
        {
            root[key] = arrayObj;
        }

        if (bFlushNow) flush();
    }

    template <typename T>
        void appendEx(const std::string& key, std::vector<T>& value)
    {
        Json::Value arrayObj;

        if (!value.empty())
        {
            typename std::vector<T>::iterator iter    = value.begin();
            typename std::vector<T>::iterator& iEnd    = value.end();
            for (; iter != iEnd; ++iter)
            {
                T& current_value = *iter;
                current_value.clearBuffer();
                current_value.serialized();
                arrayObj.append( current_value.root );
            }
        }
        else
        {
            arrayObj.resize(0);
        }

        if (bToArray || key.empty())
        {
            root.append(arrayObj);
        }
        else
        {
            root[key] = arrayObj;
        }

        if (bFlushNow) flush();
    }

    template <typename V>
        bool read(const std::string& key, std::vector<V>& value)
    {
        Json::Value& arrayObj = bToArray ? root[readPos++] : root[key];

        value.clear();
        Json::Value::iterator iter = arrayObj.begin();
        Json::Value::iterator iEnd = arrayObj.end();
        for (; iter!=iEnd; ++iter)
        {
            value.push_back(readValue(*iter, V()));
        }
        return true;
    }

    template <typename V>
        bool readEx(const std::string& key, std::vector<V>& value)
    {
        Json::Value& arrayObj = bToArray ? root[readPos++] : root[key];

        value.clear();
        V vObj;
        Json::Value::iterator iter = arrayObj.begin();
        Json::Value::iterator iEnd = arrayObj.end();
        for (; iter!=iEnd; ++iter)
        {
            Json::Value& current_value = *iter;
            vObj.clearBuffer();
            vObj.root = current_value;
            vObj.deserialize(NULL, 0);
            value.push_back(vObj);
        }
        return true;
    }
#endif

#ifdef _LIST_
    template <typename T>
        void append(const std::string& key, const std::list<T>& value)
    {
        Json::Value arrayObj;

        if (!value.empty())
        {
            typename std::list<T>::const_iterator iter    = value.begin();
            typename std::list<T>::const_iterator& iEnd    = value.end();
            for (; iter != iEnd; ++iter)
            {
                arrayObj.append(*iter);
            }
        }
        else
        {
            arrayObj.resize(0);
        }

        if (bToArray || key.empty())
        {
            root.append(arrayObj);
        }
        else
        {
            root[key] = arrayObj;
        }

        if (bFlushNow) flush();
    }
    template <typename V>
        bool read(const std::string& key, std::list<V>& value)
    {
        Json::Value& arrayObj = bToArray ? root[readPos++] : root[key];

        value.clear();
        Json::Value::const_iterator iter = arrayObj.begin();
        Json::Value::const_iterator iEnd = arrayObj.end();
        for (; iter!=iEnd; ++iter)
        {
            value.push_back(read(*iter));
        }
    }
#endif

#ifdef _MAP_
    template <typename K, typename V>
        void append(const std::string& key, const std::map<K, V>& value)
    {
        Json::Value arrayObj;

        typename std::map<K, V>::const_iterator iter    = value.begin();
        typename std::map<K, V>::const_iterator& iEnd    = value.end();
        for (; iter != iEnd; ++iter)
        {
            arrayObj[iter->first] = (iter->second);
        }

        if (bToArray || key.empty())
        {
            root.append(arrayObj);
        }
        else
        {
            root[key] = arrayObj;
        }

        if (bFlushNow) flush();
    }
    template <typename K, typename V>
        bool read(const std::string& key, std::map<K, V>& value)
    {
        Json::Value arrayObj = root[key];

        value.clear();
    }
#endif

#ifdef _XSTRING_
    void append(const std::string& key, const std::string& value)
    {
        if (bToArray || key.empty())
        {
            root.append(value);
        }
        else
        {
            root[key] = value;
        }

        if (bFlushNow) flush();
    }
#endif

    void append(const std::string& key, JsonSerializer& value);

public:
    bool parse(const char* str, size_t size);

    bool read(const std::string& key, bool& value);

    bool read(const std::string& key, int8& value);
    int8 readValue(const Json::Value& v, int8 def=0) const;

    bool read(const std::string& key, int16& value);
    int16 readValue(const Json::Value& v, int16 def=0) const;

    bool read(const std::string& key, int32& value);
    int32 readValue(const Json::Value& v, int32 def=0) const;

    bool read(const std::string& key, int64& value);
    int64 readValue(const Json::Value& v, int64 def=0) const;

    bool read(const std::string& key, uint8& value);
    uint8 readValue(const Json::Value& v, uint8 def=0) const;

    bool read(const std::string& key, uint16& value);
    uint16 readValue(const Json::Value& v, uint16 def=0) const;

    bool read(const std::string& key, uint32& value);
    uint32 readValue(const Json::Value& v, uint32 def=0) const;

    bool read(const std::string& key, uint64& value);
    uint64 readValue(const Json::Value& v, uint64 def=0) const;

    bool read(const std::string& key, float& value);
    float readValue(const Json::Value& v, float def=0) const;

    bool read(const std::string& key, char* value);

#ifdef _XSTRING_
    bool read(const std::string& key, std::string& value)
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asCString();

        return true;
    }
    std::string readValue(const Json::Value& v, std::string def="") const
    {
        try
        {
            return v.asCString();
        }
        catch ()
        {
            TRACE("Json讀取未知異常.\n");
            return def;
        }
        return def;
    }
#endif

    bool read(const std::string& key, time_t& value);

    template <typename T>
    void readObj(const std::string& key, T& value)
    {
        Json::Value& obj = (bToArray || key.empty()) ? root[readPos++] : root[key];
        value.root = obj;
        value.deserialize();
    }

private:
    size_t get_temp_buffer_size(const size_t src_length);

public:
    Json::FastWriter    writer;
    Json::Reader        reader;
    Json::Value            root;

    std::string            document;        ///< json字符串

    bool                bFlushNow;        ///< 立即刷新json字符串
    bool                bEnableZip;        ///< 將json字符串壓縮/解壓縮成zip格式
    bool                bToArray;        ///< 序列化成數(shù)組

    std::vector<uint8>    zipBuffer;

    int                    readPos;        ///< 數(shù)組讀取索引
    int                    writePos;        ///< 數(shù)組寫入索引
};


#define OUTPUT_JSON_LEN(MSG) printf("字符串長(zhǎng)度:%d\n", MSG.getString().length());
#define OUTPUT_STYLE_JSON(MSG) printf(MSG.style_flush().c_str());
#define OUTPUT_JSON(MSG) printf(MSG.getString().c_str());

#define TEST_SERIALIZE(MSG) MSG.serialized(); OUTPUT_JSON_LEN(MSG); OUTPUT_STYLE_JSON(MSG);


#endif

JsonSerializer.cpp
/**********************************************************************
* Copyright (C) 2015 - tx7do - All Rights Reserved
*
* 文件名稱:        JsonSerializer.cpp
* 摘    要:        Json序列化工具
*
* 作    者:        yanglinbo, 
* 修    改:        查看文件最下方.

**********************************************************************
*/

#include "Stdafx.h"
#include "JsonSerializer.h"
#include <json/json.h>
#include <zip.h>
#include <unzip.h>

#ifdef _DEBUG
#    pragma comment(lib, "json_vc71_libmtd.lib")
#    pragma comment(lib, "zlib1d.lib")
#else
#    pragma comment(lib, "json_vc71_libmt.lib")
#    pragma comment(lib, "zlib1.lib")
#endif

JsonSerializer::JsonSerializer() : bFlushNow(false)
, bEnableZip(false)
, bToArray(false)
, readPos(0)
, writePos(0)
{
    //writer = new Json::FastWriter;
    
//reader = new Json::Reader;
    
//root = new Json::Value;
}

JsonSerializer::~JsonSerializer()
{
    //safe_delete(writer);
    
//safe_delete(reader);
    
//safe_delete(root);
}

void JsonSerializer::clearBuffer()
{
    root.clear();
    flush();
    document.clear();

    resetPosition();
}

const char* JsonSerializer::flush()
{
    document.clear();
    document = writer.write(root);
    if (bEnableZip)
    {
        if (zipBuffer.size() < document.length())
        {
            zipBuffer.resize(document.length());
        }

        uLong comprLen = (uLong) zipBuffer.size();
        int err = compress(&zipBuffer[0], &comprLen, (const Bytef*)document.c_str(), (uLong)document.length());
        //TRACE("壓縮長(zhǎng)度:%d\n", comprLen);
        document.assign((const char*)&zipBuffer[0], comprLen);
    }
    return document.c_str();
}

const std::string& JsonSerializer::style_flush()
{
    flush();
    Json::StyledWriter style_writer;
    Json::Reader style_reader;
    style_reader.parse( document, root );
    document = style_writer.write( root );
    return document;
}

bool JsonSerializer::isKeyValid(const std::string& key) const
{
    return !root[key].isNull();
}

bool JsonSerializer::isKeyValid(const char* key) const
{
    return !root[key].isNull();
}

void JsonSerializer::append(const std::string& key, const int8& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const int16& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const int32& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const int64& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const uint8& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const uint16& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const uint32& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const uint64& value)
{
    if (bToArray || key.empty())
    {
        root.append(value);
    }
    else
    {
        root[key] = value;
    }
    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, const float& value)
{
    char buffer[64] = {0};

#if _MSC_VER > 1310
    int result = _snprintf_s(buffer, sizeof (buffer), "%.2f", value);
#else
    int result = _snprintf(buffer, sizeof (buffer), "%.2f", value);
#endif
    if (result==sizeof(buffer) || result<0)
    {
        buffer[sizeof(buffer)-1] = 0;
    }

    if (bToArray || key.empty())
    {
        root.append(buffer);
    }
    else
    {
        root[key] = buffer;
    }

    if (bFlushNow) flush();
}

void JsonSerializer::append(const std::string& key, JsonSerializer& value)
{
    value.serialized();

    if (bToArray || key.empty())
    {
        root.append(value.root);
    }
    else
    {
        root[key] = value.root;
    }

    if (bFlushNow) flush();
}

bool JsonSerializer::parse(const char* str, size_t size)
{
    if (bEnableZip)
    {
        uLong uncomprLen = (uLong)get_temp_buffer_size(size + 1);
        if (zipBuffer.size() < uncomprLen)
        {
            zipBuffer.resize(uncomprLen);
        }
        Byte* uncompr = &zipBuffer[0];

        ZeroMemory(uncompr, uncomprLen);
        int err = uncompress(uncompr, &uncomprLen, (const Byte*)str, (uLong)size);

        str = (const char*) uncompr;
        size = uncomprLen;
    }

    if (!reader.parse(str, str+size, root, false))
    {
        std::string strError = reader.getFormatedErrorMessages();
        TRACE("解析錯(cuò)誤:[%s]\n", strError.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, bool& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asBool();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, int8& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asInt();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, int16& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asInt();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, int32& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asInt();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, int64& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asInt64();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, uint8& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asUInt();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, uint16& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asUInt();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, uint32& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asUInt();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, uint64& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asUInt64();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, float& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;
        if (v.isString())
        {
            const char* str = 0;
            str = v.asCString();
            if (str == NULL) return false;

            char temp = 0;
#if _MSC_VER > 1310
            sscanf_s(str, " %g", &value, &temp);
#else
            sscanf(str, " %g", &value, &temp);
#endif
            return true;
        }
        else if (v.isDouble())
        {
            value = v.asFloat();
            return true;
        }
        else if (v.isInt())
        {
            value = (float) v.asInt();
        }
        else if (v.isUInt())
        {
            value = (float) v.asUInt();
        }
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, TCHAR* value)
{
    if (value == NULL) return false;

    try
    {
        const char* str = NULL;
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        str = v.asCString();

        if (str == NULL) return false;

        strncpy(value, str, strlen(str));
        //value[str.length()+1] = '\0';.
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

bool JsonSerializer::read(const std::string& key, time_t& value)
{
    try
    {
        Json::Value& v = (bToArray || key.empty()) ? root[readPos++] : root[key];
        if (v.isNull()) return false;

        value = v.asInt();
    }
    catch (std::exception& e)
    {
        TRACE("[%s]Json讀取異常: %s.\n", key.c_str(), e.what());
        return false;
    }
    catch ()
    {
        TRACE("[%s]Json讀取未知異常.\n", key.c_str());
        return false;
    }

    return true;
}

size_t JsonSerializer::get_temp_buffer_size(const size_t src_length)
{
    const size_t MB = 1024 * 1024;
    if (src_length < 1*MB)
    {
        return 1*MB;
    }
    else if ((src_length >= 1*MB) && (src_length < 8*MB))
    {
        return 8*MB;
    }
    else
    {
        return 16*MB;
    }
}

int8 JsonSerializer::readValue(const Json::Value& v, int8 def/*=0*/const
{
    try
    {
        return v.asInt();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

int16 JsonSerializer::readValue(const Json::Value& v, int16 def/*=0*/const
{
    try
    {
        return v.asInt();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

int32 JsonSerializer::readValue(const Json::Value& v, int32 def/*=0*/const
{
    try
    {
        return v.asInt();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

int64 JsonSerializer::readValue(const Json::Value& v, int64 def/*=0*/const
{
    try
    {
        return v.asInt64();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

uint8 JsonSerializer::readValue(const Json::Value& v, uint8 def/*=0*/const
{
    try
    {
        return v.asUInt();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

uint16 JsonSerializer::readValue(const Json::Value& v, uint16 def/*=0*/const
{
    try
    {
        return v.asUInt();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

uint32 JsonSerializer::readValue(const Json::Value& v, uint32 def/*=0*/const
{
    try
    {
        return v.asUInt();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

uint64 JsonSerializer::readValue(const Json::Value& v, uint64 def/*=0*/const
{
    try
    {
        return v.asUInt64();
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

float JsonSerializer::readValue(const Json::Value& v, float def/*=0*/const
{
    try
    {
        float value = 0;

        if (v.isString())
        {
            const char* str = 0;
            str = v.asCString();
            if (str == NULL) return false;

            char temp = 0;
#if _MSC_VER > 1310
            sscanf_s(str, " %g", &value, &temp);
#else
            sscanf(str, " %g", &value, &temp);
#endif
            return value;
        }
        else if (v.isNumeric())
        {
            value = v.asFloat();
            return value;
        }
    }
    catch ()
    {
        TRACE("Json讀取未知異常.\n");
        return def;
    }
    return def;
}

測(cè)試1
struct TestData1 : public JsonSerializer
{
    time_t        nServerTime;

    TestData1()
    {
        clear();
    }

    void clear()
    {
        nServerTime = 0;
    }

    /// 序列化
    virtual const char* serialized()
    {
        clearBuffer();
        append(_T("time"), nServerTime);
        return flush();
    }

    /// 反序列化
    virtual bool deserialize(const char* str, size_t size)
    {
        if (str != NULL && size != 0)
        {
            if (!parse(str, size)) return false;
        }

        read(_T("time"), nServerTime);

        return true;
    }
};

void test1()
{
    // 序列化
    TestData1 data1;
    data1.nServerTime = time(0);
    data1.serialized();
    OUTPUT_STYLE_JSON(data1);

    // 反序列化
    TestData1 data2;
    std::string strJson = "{\"time\" : 1481207292 }";
    data2.deserialize(strJson.c_str(), strJson.length());
    printf("time :%d\n", data2.nServerTime);
}

測(cè)試2
struct TestData2 : public JsonSerializer
{
    time_t        nServerTime;
    std::vector<int32> arrInt;
    std::string strTest;

    TestData2()
    {
        clear();
    }

    void clear()
    {
        nServerTime = 0;
        arrInt.clear();
        strTest.clear();
    }

    /// 序列化
    virtual const char* serialized()
    {
        clearBuffer();
        append(_T("time"), nServerTime);
        append(_T("ints"), arrInt);
        append(_T("str"), strTest);
        return flush();
    }

    /// 反序列化
    virtual bool deserialize(const char* str, size_t size)
    {
        if (str != NULL && size != 0)
        {
            if (!parse(str, size)) return false;
        }

        read(_T("time"), nServerTime);
        read(_T("ints"), arrInt);
        read(_T("str"), strTest);

        return true;
    }
};

void test2()
{
    // 序列化
    TestData2 data1;
    data1.nServerTime = time(0);
    data1.arrInt.push_back(1);
    data1.arrInt.push_back(2);
    data1.arrInt.push_back(3);
    data1.arrInt.push_back(4);
    data1.strTest = "序列化字符串";

    data1.serialized();
    OUTPUT_STYLE_JSON(data1);
}

測(cè)試執(zhí)行兩個(gè)測(cè)試的結(jié)果大概如下:


注意:
1.依賴zlib,在第三方庫里面拷貝zlib1d.dll到bin目錄;
2.jsoncpp的lib我嫌太大了,就刪掉了,需要自行編譯.


完整代碼下載
/Files/tx7do/testJsonSerializer.zip

posted on 2016-12-08 22:49 楊粼波 閱讀(2189) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲主播在线观看| 欧美一区三区三区高中清蜜桃 | 亚洲一区二区在线看| 亚洲国产精品999| 在线日韩欧美| 亚洲午夜激情网站| 久久精品免费看| 久久大综合网| 久久精品亚洲一区二区| 久久九九热re6这里有精品| 久久久久久久久久看片| 蜜臀久久久99精品久久久久久| 美女免费视频一区| 亚洲二区视频| 亚洲国内自拍| 亚洲欧美视频一区| 久久亚洲精选| 欧美三级午夜理伦三级中视频| 国产精品女主播| 亚洲第一毛片| 久久久久国产成人精品亚洲午夜| 欧美影院视频| 亚洲福利视频网站| 中文av一区特黄| 久久久久久久一区二区三区| 欧美—级高清免费播放| 国产精品综合视频| 亚洲第一页中文字幕| 亚洲一区www| 久久免费视频一区| 亚洲每日更新| 久久婷婷av| 国产精品免费小视频| 亚洲人体影院| 麻豆精品网站| 亚洲永久网站| 欧美日韩亚洲一区在线观看| 激情久久久久久| 亚洲欧美日韩直播| 亚洲激情偷拍| 久久久久在线| 国产精品卡一卡二| 99成人在线| 欧美成人一区二区三区片免费| 午夜精品久久久久| 国产精品国产a级| 日韩视频中文| 欧美mv日韩mv亚洲| 欧美一区二区三区在线观看| 国产精品igao视频网网址不卡日韩 | 亚洲精品一二区| 久久久久久久波多野高潮日日| 亚洲精品精选| 久久er精品视频| 亚洲人永久免费| 免费一级欧美片在线观看| 国产日韩精品一区二区三区在线| 亚洲网站在线观看| 99精品欧美一区二区三区综合在线 | 久久久亚洲人| 欧美插天视频在线播放| 亚洲国产一区二区三区a毛片| 男男成人高潮片免费网站| 一区二区三区四区五区精品视频| 国产精品拍天天在线| 裸体一区二区| 欧美色偷偷大香| 一区二区激情小说| 91久久精品www人人做人人爽| 欧美中文字幕在线| 黄网站免费久久| 久久国产精品久久国产精品| 午夜久久影院| 伊人精品视频| 亚洲国产一区在线| 欧美性久久久| 久久国产精品久久精品国产| 久久久久成人精品| 亚洲另类在线视频| 这里只有视频精品| 激情自拍一区| 亚洲国产老妈| 欧美午夜精品久久久久久超碰| 午夜激情一区| 乱中年女人伦av一区二区| 一本到高清视频免费精品| 一本综合精品| 国内精品久久久久久久果冻传媒| 美腿丝袜亚洲色图| 欧美日韩喷水| 久久视频免费观看| 欧美另类专区| 久久午夜视频| 欧美日韩在线不卡| 久久综合综合久久综合| 欧美久久一级| 久久久www成人免费无遮挡大片| 免费看的黄色欧美网站| 亚洲欧美中文日韩在线| 蜜臀va亚洲va欧美va天堂| 亚洲资源av| 免费看亚洲片| 久久婷婷国产综合精品青草| 9久re热视频在线精品| 欧美在线日韩| 亚洲欧美影院| 欧美丰满高潮xxxx喷水动漫| 亚洲欧美中文另类| 免费在线欧美黄色| 久久久亚洲国产美女国产盗摄| 欧美绝品在线观看成人午夜影视 | 亚洲第一免费播放区| 亚洲一级高清| 亚洲精品在线三区| 国模精品一区二区三区色天香| 美女脱光内衣内裤视频久久影院| 国产精品r级在线| 亚洲春色另类小说| 激情懂色av一区av二区av| 正在播放欧美一区| 一区二区三区 在线观看视| 久久夜色精品国产亚洲aⅴ| 香蕉乱码成人久久天堂爱免费| 欧美精品福利在线| 亚洲电影一级黄| 在线看欧美日韩| 久久久久久久波多野高潮日日| 欧美伊人久久| 国产视频一区二区在线观看 | 久久久噜噜噜久久久| 欧美影院精品一区| 国产精品一区二区在线观看不卡| 日韩亚洲欧美成人| 日韩午夜一区| 欧美国产日韩精品| 最新日韩欧美| 日韩亚洲在线观看| 欧美激情一区二区三区在线视频 | 亚洲人妖在线| 亚洲婷婷免费| 国产精品美女久久久久久久| 一区二区三区视频观看| 亚洲一区二区三区激情| 国产精品国产自产拍高清av王其 | 欧美日韩国产综合在线| 亚洲免费不卡| 亚洲免费视频网站| 国产精品日韩一区二区| 亚洲女性裸体视频| 欧美在线综合视频| 经典三级久久| 免费日韩av| 一本色道久久综合一区| 亚洲欧美卡通另类91av| 国产精品人人做人人爽人人添| 午夜久久久久久久久久一区二区| 久久久久久一区| 91久久国产综合久久蜜月精品 | 久久久久久**毛片大全| 欧美1级日本1级| 99视频精品在线| 国产日韩三区| 欧美成人午夜免费视在线看片| 亚洲日本视频| 欧美自拍偷拍午夜视频| 亚洲电影自拍| 欧美色视频一区| 久久偷看各类wc女厕嘘嘘偷窃| 国产亚洲精品bt天堂精选| 久久久久久久综合| 一本色道88久久加勒比精品| 欧美一区中文字幕| 日韩午夜精品视频| 国产在线视频不卡二| 欧美精品久久99久久在免费线| 欧美激情久久久久| 好吊色欧美一区二区三区视频| 欧美14一18处毛片| 一区二区三区 在线观看视| 欧美一级黄色录像| 亚洲理论电影网| 国产一区二区主播在线| 欧美日韩极品在线观看一区| 香蕉免费一区二区三区在线观看| 欧美激情视频免费观看| 欧美在线一级va免费观看| 亚洲日本中文字幕| 韩国成人福利片在线播放| 欧美日韩亚洲不卡| 狼狼综合久久久久综合网| 亚洲一区图片| 日韩视频免费观看高清在线视频| 久久久久久久97| 亚洲一区二区三区精品视频| 精品电影在线观看| 国产日韩欧美在线播放不卡| 国产精品v欧美精品v日本精品动漫| 卡一卡二国产精品| 久久久99精品免费观看不卡| 亚洲香蕉伊综合在人在线视看|