Выполните предварительную проверку строки JSON в C ++ из файла .txt

В настоящее время я работаю в C ++, получая ответ HTTP на запрос, который я записываю в файл .txt, используя ostream. Это происходит асинхронно, и я не хочу это менять.

После того, как данные закончены, я хочу прочитать из файла

{"data":{"request":[{"type":"City","query":"London, United Kingdom"}],"weather":[{"date":"2013-04-21","astronomy".....

~ каким-то образом ~ преттифицируйте строку, используя либо внешнюю библиотеку, такую ​​как nlohmann / json или другую (?), а затем

а) распечатайте его на консоли и
б) сохранить его в другом файле (pretty.json)

У меня проблемы с пониманием, какой метод использовать:
https://github.com/nlohmann/json

Есть идеи, как подойти к этому?

Я думал получать файл построчно, пока я не нажму EOF в своего рода «буфер», а затем запусту _json и сохраню решение, которое можно отобразить на консоли …

Мой код пока

#include <cpprest/http_client.h>
#include <cpprest/filestream.h>
#include <iostream>
#include <sstream>
#include "json.hpp"using namespace utility;                // string conversion
using namespace web;                    // URI
using namespace web::http;              // HTTP commands
using namespace web::http::client;      // HTTP Client features
using namespace concurrency::streams;   // Asynch streams, like Node

using json = nlohmann::json;

int main()
{
auto fileStream = std::make_shared<ostream>();

// Open stream to output file.
pplx::task<void> requestTask = fstream::open_ostream(U("results.txt"))

.then([=](ostream outFile)

{
*fileStream = outFile;

http_client client //gets the info
return client.request(methods::GET, stringBuilder.to_string());
})

.then([=](http_response response)       // set up response handler
{
printf("Received response status code:%u\n", response.status_code());

return response.body().read_to_end(fileStream->streambuf());

})

.then([=](size_t)       // close file stream
{
return fileStream->close();
})

.then([=]()
{
nlohmann::json j;
std::ifstream i;
i.open("results.txt"); // ?? <<< === this is where my question is
});

// Wait for all the outstanding I/O to complete, handle exceptions
try
{
requestTask.wait();
}
catch (const std::exception &e)
{
printf("Error exception:%s\n", e.what());
}return 0;
}

РЕШЕНИЕ:

.then([=]()
{

// read a JSON file
std::ifstream readFromFile("results.txt");
if (readFromFile.is_open()) {

nlohmann::json j;
readFromFile >> j;

// write prettified JSON to another file
std::ofstream writeToFile("pretty.json");
writeToFile << std::setw(4) << j << std::endl;

readFromFile.close();
writeToFile.close();
}
else {
std::cout << "unable to open file";
}

});

0

Решение

У вас есть два варианта для претенциозности с помощью nlohmann.

Использует дамп, который производит строку

int indent = 4;
nlohmann::json data;
data.dump(indent);

Или используйте выходную перегрузку потока с установленной шириной поля

std::ofstream o("pretty.json");
o << std::setw(4) << data << std::endl;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]