c++ 使用 rapidjson 解析本地 json 文件

2019-09-30  本文已影响0人  云胡同学

概述

使用 rapidjson 来解析本地的 json 文件。

本地 json 文件

{
    "num": 3,
    "subject": [
        "Math",
        "English",
        "Computer Science"
    ],
    "info": [
        {
            "value": "线性代数",
            "score": 70,
            "aveScore": 75.8
        },
        {
            "value": "四六级",
            "score": 500,
            "aveScore": 410.8
        },
        {
            "value": "数据结构",
            "score": 88,
            "aveScore": 65.4
        }
    ]
}

代码

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>
#include "rapidjson/prettywriter.h"
#include "rapidjson/document.h"
#include "rapidjson/istreamwrapper.h"

using namespace std;
using namespace rapidjson;

//-----------------------------------------------------------------------------
wstring UTF8ToUnicode(const string &s)
{
    wstring result;

    // 获得缓冲区的宽字符个数
    int length = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0);

    wchar_t * buffer = new wchar_t[length];
    ::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, buffer, length);
    result = buffer;

    delete[] buffer;
    return result;
}

//-----------------------------------------------------------------------------
int main()
{
    int n;
    int score[3];
    double aveScore[3];
    string strSubject[3];
    wstring wsValue[3];

    ifstream t("document.json"); // 输入流
    IStreamWrapper isw(t);
    Document d;
    d.ParseStream(isw);

    // 获取最简单的单个键的值
    assert(d.HasMember("num"));
    assert(d["num"].IsInt());
    n = d["num"].GetInt();

    // 获取数组的值,使用引用来连续访问
    assert(d.HasMember("subject"));
    const Value& subjectArray = d["subject"];
    if (subjectArray.IsArray())
    {
        for (int i = 0; i < subjectArray.Size(); i++)
        {
            strSubject[i] = subjectArray[i].GetString();
        }
    }

    // 获取对象中的数组,也就是对象是一个数组
    assert(d.HasMember("info"));
    const Value& infoArray = d["info"];
    if (infoArray.IsArray()) {
        for (int i = 0; i < infoArray.Size(); i++) {
            const Value& tempInfo = infoArray[i];

            string strValue = tempInfo["value"].GetString();
            wsValue[i] = UTF8ToUnicode(strValue);

            score[i] = tempInfo["score"].GetInt();
            aveScore[i] = tempInfo["aveScore"].GetDouble();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读