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

概述

使用 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();