use*_*144 2 c++ json asynchronous nlohmann-json
我目前在C ++中工作,使用ostream从我写入.txt文件的请求中获取HTTP响应。这是异步发生的,我不想更改它。
数据写完后,我想从文件中读取
{"data":{"request":[{"type":"City","query":"London, United Kingdom"}],"weather":[{"date":"2013-04-21","astronomy".....
〜以某种方式〜使用外部库(例如nlohmann / json或other(?))对字符串进行美化,然后
a)将其打印到控制台,然后b)将其保存在其他文件(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;
}
Run Code Online (Sandbox Code Playgroud)
解:
.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";
}
});
Run Code Online (Sandbox Code Playgroud)
您可以通过两种选择来美化nlohmann。
使用产生字符串的转储
int indent = 4;
nlohmann::json data;
data.dump(indent);
Run Code Online (Sandbox Code Playgroud)
或者使用设置了字段宽度的流输出过载
std::ofstream o("pretty.json");
o << std::setw(4) << data << std::endl;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2616 次 |
| 最近记录: |