C ++ std :: vector в JSON Array с rapidjson - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь проанализировать базовый std :: vector строк в json, используя библиотеку rapidjson.

Несмотря на то, что есть несколько ответов на этот вопрос онлайн, ни один из них не помог мне. Лучшее, что я мог найти, было это , но я получаю сообщение об ошибке (немного исправлено):

Ошибка C2664 «noexcept»: невозможно преобразовать аргумент 1 из «std :: basic_string, std :: allocator>» в «rapidjson :: GenericObject, rapidjson :: MemoryPoolAllocator >>»

Мой код в основном основан на ссылке выше:

rapidjson::Document d;
std::vector<std::string> files;

// The Vector gets filled with filenames,
// I debugged this and it works without errors.
for (const auto & entry : fs::directory_iterator(UPLOAD_DIR))
    files.push_back(entry.path().string());

// This part is based on the link provided
d.SetArray();

rapidjson::Document::AllocatorType& allocator = d.GetAllocator();
for (int i = 0; i < files.size(); i++) {
    d.PushBack(files.at(i), allocator);
}
rapidjson::StringBuffer strbuf;
rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
d.Accept(writer);

jsonString = strbuf.GetString();

Было бы неплохо, если бы кто-то мог объяснить, чего мне здесь не хватает, так как я не до конца понимаю ошибку, которая появляется. Я предполагаю, что это должно что-то делать с предоставленными типами строк, но ошибка генерируется в файле Rapidjson ..

Я также был бы признателен, если бы вы могли привести и другие рабочие примеры.

Заранее спасибо!

EDIT Под JSON Array я подразумеваю просто базовую строку json, содержащую значения вектора.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

x2struct - это оболочка rapidjson, с его помощью вы можете конвертировать между объектом C ++ и json.

#include <iostream>
#include "x2struct/x2struct.hpp"

using namespace std;


int main(int argc, char*argv[]) {
    vector<string> v;
    v.push_back("hello");
    v.push_back("world");
    string json = x2struct::X::tojson(v); // vector to json
    cout<<json<<endl;
    return 0;  
}

вывод:

["hello","world"]
1 голос
/ 09 апреля 2019

Кажется, что строковые типы std :: string и rapidjson :: UTF8 несовместимы. Я установил небольшую тестовую программу, и она, кажется, сработает, если вы создадите объект rapidjson :: Value и сначала вызовете его метод SetString.

#include <iostream>
#include <vector>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"

int main() {
    rapidjson::Document document;
    document.SetArray();

    std::vector<std::string> files = {"abc", "def"};
    rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
    for (const auto file : files) {
        rapidjson::Value value;
        value.SetString(file.c_str(), file.length(), allocator);
        document.PushBack(value, allocator);
        // Or as one liner:
        // document.PushBack(rapidjson::Value().SetString(file.c_str(), file.length(), allocator), allocator);
    }

    rapidjson::StringBuffer strbuf;
    rapidjson::Writer<rapidjson::StringBuffer> writer(strbuf);
    document.Accept(writer);

    std::cout << strbuf.GetString();

    return 0;
}
...