使用jsoncpp解析JSON数据

上节《JSON数据格式》中我们讲到了JSON的数据格式和一些应用的地方,接着上面的说下去,jsoncpp和boost.property_tree都可以解析JSON文件,我们先将jsoncpp如何解析。

1.jsoncpp是什么?

jsoncpp是一个使用C++语言来解析json文件的开源库,其项目地址为:http://sourceforge.net/projects/jsoncpp/,属于免费项目,任何人都可以下载使用

2. 编译jsoncpp

jsoncpp文件中提供了vs71的工程文件以及makerelease.py文件,用来编译,里面分为jsontest、lib_json、test_lib_json三个工程,按照自己需要的编译。

注意:如果使用VS默认的编译选项MTd或者MT,在使用json_libmtd.lib的时候可能会出现LNK2038错误(我使用的VS2012 vc110环境)所以请修改MTD为MDd,MT为MD

3.使用jsoncpp读JSON文件

如何将lib库添加进VS工程中在此就不赘述了。先看第一个读文件的例

结果:

跟我们文件中的数据完全一致。

4.使用JSON写入一块数据

我们继续使用上述文件,在中间加上一块数据。我们插入一个新的{"name": "append", "email": "append@163.com"}

结果:


当然了,jsoncpp对数组的解析也支持STL中迭代器的风格,不过我个人觉得还是数组好理解一些。迭代器的解析风格就不写了,大家可以自己摸索下,主要是使用Json::Value::Members。

JSON官方还是非常推荐用jsoncpp来解析JSON文件的,大家也看到了,确实比较方便。

btw.因为这两天笔记本散热不好,所以接了套螺丝刀将笔记本大卸八块,扫了扫灰,然后又装上了,结果神奇的就好了,果然是贱啊,欠拆。所以json系列的文章就晚了几天,非常抱歉,好了,不早了,该睡觉了,各位晚安。


NickYang

NickYang

无知一码农,现居住于上海,从事游戏服务器端开发
http://www.cppfans.org


Comments

  1. 因为json是弱语法,可能在解析时碰到需要的字段不存在的情况。
    针对jsoncpp,我还做了一组专门的宏,当字段不存在时会抛出异常,这样碰到大量数据解析时可以省不少代码:

    #include
    #include

    //对于三个点(…)的可变参数,用此宏来快速打印。
    #define VAR_PARAM_PRINT(TARGET_STRING, VAR_STRING) \
    { \
    va_list vp; \
    va_start(vp, VAR_STRING); \
    vsnprintf(TARGET_STRING, sizeof(TARGET_STRING), VAR_STRING, vp); \
    va_end(vp); \
    }

    class CJsonException
    {
    public:
    CJsonException(const char *pszErrMsg, …)
    {
    VAR_PARAM_PRINT(m_szErrMsg, pszErrMsg);
    }

    const char *what()
    {
    return m_szErrMsg;
    }

    private:
    char m_szErrMsg[512];
    };

    #define GetJsonArray(Node, Key) \
    ({ \
    if(false==Node.isMember(Key)) \
    { \
    throw CJsonException(“Key [%s] does not exist”, #Key); \
    } \
    \
    if(Node[Key].isArray()) \
    { \
    } \
    else if(Node[Key].isObject() && Node[Key].size()==0) /*compatible with UnrealEngine’s JSON lib*/\
    { \
    } \
    else if(Node[Key].isNull()) \
    { \
    } \
    else \
    { \
    throw CJsonException(“Key [%s] is not an array”, #Key); \
    } \
    \
    Node[Key]; \
    })

    #define GetJsonObject(Node, Key) \
    ({ \
    if(!Node.isObject()) \
    { \
    throw CJsonException(#Node ” is not an object”); \
    } \
    \
    if(false==Node.isMember(Key)) \
    { \
    throw CJsonException(“Key [%s] does not exist”, #Key); \
    } \
    \
    Node[Key]; \
    })

    #define GetJsonData(Node, Key, Type) \
    ({ \
    if(!Node.isObject()) \
    { \
    throw CJsonException(#Node ” is not an object”); \
    } \
    \
    if(false==Node.isMember(Key)) \
    { \
    throw CJsonException(“Key [%s] does not exist”, #Key); \
    } \
    \
    if(!Node[Key].is##Type()) \
    { \
    throw CJsonException(“Key [%s] is not %s”, #Key, #Type); \
    } \
    \
    Node[Key].as##Type(); \
    })

    潜水 Chrome浏览器 Windows 7 x64 Edition
  2. {
    “type”: “ZH_CN2EN”,
    “errorCode”: 0,
    “elapsedTime”: 1,
    “translateResult”: [
    [
    {
    “src”: “你好”,
    “tgt”: “How are you”
    }
    ]
    ]
    }

    src 和 tgt怎么解析出来,我的邮箱forcj@qq.com

    潜水 搜狗浏览器 Windows 7 x64 Edition

发表评论

电子邮件地址不会被公开。 必填项已用*标注