如何解决使用 nlohmann json 或 Rapidjson 解析 libcurl 响应
我的 libcurl 代码返回我的 json 字符串:
{"object":"user","attributes":{"id":000,"admin":false,"username":"un","email":"google@gmail.com","first_name":"leopold95","last_name":"leopold95","language":"en"}}
我想在我的对象中解析这个字符串(我的问题不在其中)。 但是当我尝试用 nlohmann 或快速解析这个时,我有一个错误。 但是如果我尝试解析这个字符串:
string str = "{\"object\":\"user\",\"attributes\":{\"id\":36,\"admin\":false,\"username\":\"a4qsmr9m\",\"email\":\"leopold9586@gmail.com\",\"first_name\":\"leopold95\",\"last_name\":\"leopold95\",\"language\":\"en\"}}";
使用 nlohmann 一切正常。速度很快,我也没有错误。
所以,我的问题是:
我如何用 nlohmann 解析这个字符串(第一个)?
或
如何将我的响应中的所有 " 替换为 \"?
并且,诅咒 replace(s,"","");替换(s,'','');,替换(s.begin(),s.end(),""/'',""/''); 不要为我工作。在某些情况下,我在字符串末尾有“替换符号”
如果你需要我可以添加更多代码或将项目发布到 git
编辑:
UserInfo Engine::testIU(string link)
{
CURL* curl;
CURLcode res;
string readBuffer;
curl = curl_easy_init();
struct curl_slist* headers = NULL; //headers struct
if (curl) {
//headers = curl_slist_append(headers,"Content-Type: application/json");
headers = curl_slist_append(headers,"Accept: application/json");
headers = curl_slist_append(headers,"Authorization: Bearer imr8VuU9L6qUTjyZQ0srCNyfFE7Ru0v8VOLZBMd8bhjxJFfP");
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers); //add headers
curl_easy_setopt(curl,CURLOPT_URL,link.c_str()); //set url
curl_easy_setopt(curl,CURLOPT_CUSTOMREQUEST,"GET"); //set http method
//curl_easy_setopt(curl,CURLOPT_RETURNTR,true);
//curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,WriteCallback);
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,&readBuffer); /* data goes here */
res = curl_easy_perform(curl);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
}
json j = json::parse(readBuffer);
testUserI.id = j["attributes"]["id"].get<int>();
testUserI.admin = j["attributes"]["admin"].get<bool>();
testUserI.username = j["attributes"]["username"].get<string>();
testUserI.email = j["attributes"]["email"].get<string>();
return testUserI;
}
struct UserInfo
{
int id = 0;
bool admin = NULL;
string username = "";
string email = "";
string first_name = "";
string last_name = "";
};
{"object":"user","attributes":{"id":0,"username":"a4qsmr9m","language":"en"}}
编辑 2:所以如果你有同样的问题,只需在你的代码中解决这个问题:
curl_easy_setopt(curl,WriteCallback);
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&readBuffer);
并查看上面的答案以及那里的所有内容
解决方法
您得到的 json.exception.parse_error
是因为 "id":000
不是有效的 JSON。很可能应该是 "id":0
。
解决这个问题的正确方法是要求另一端纠正错误。
如何将我的响应中的所有 "
替换为 \"
?
这无济于事,实际上会使 JSON 更加无效。 \
初始化中的 str
不会成为字符串的一部分,您认为有效的唯一原因是因为 id
字段 "id":36
字符串 is 有效。将其替换为 "id":000
,您将看到它也无法解析。
关于添加的 curl
代码的注释。以下内容不正确,会导致未定义的行为:
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,&readBuffer);
CURLOPT_POSTFIELDS
的参数应该是 char*
,而不是 std::string*
。如果您不使用该选项进行发布,请删除该选项。
您需要通过 std::string*
提供 CURLOPT_WRITEDATA
并在您的 std::string&
回调中将其转换回 CURLOPT_WRITEFUNCTION
。
示例:
size_t WriteCallback(char* ptr,size_t size,size_t nmemb,void* userdata) {
std::string& buf = *static_cast<std::string*>(userdata);
buf.append(ptr,std::next(ptr,nmemb * size));
return nmemb * size;
}
curl_easy_setopt(curl,CURLOPT_WRITEDATA,&readBuffer);
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,WriteCallback);
对于测试,您不必使用反斜杠转义所有 "
,只需使用原始字符串文字即可。
示例:(将 "id":000
更改为 "id":0
就可以了)
#include <nlohmann/json.hpp>
#include <iostream>
#include <string>
using json = nlohmann::json;
int main() {
std::string str =
R"aw({"object":"user","attributes":{"id":000,"admin":false,"username":"un","email":"google@gmail.com","first_name":"leopold95","last_name":"leopold95","language":"en"}})aw";
try {
auto j = json::parse(str);
std::cout << j.dump(2) << '\n';
} catch(const json::exception& ex) {
std::cerr << "Parse error: " << ex.what() << '\n';
}
}
输出:Parse error: [json.exception.parse_error.101] parse error at line 1,column 38: syntax error while parsing object - unexpected number literal; expected '}'
已修复错误的输出:
{
"attributes": {
"admin": false,"email": "google@gmail.com","first_name": "leopold95","id": 0,"language": "en","last_name": "leopold95","username": "un"
},"object": "user"
}
在您编辑的问题中输入:
std::string str =
R"aw({"object":"user","attributes":{"id":36,"username":"a4qsmr9m","email":"leopold9586@gmail.com","language":"en"}})aw";
它会被成功解析并且上面的程序会打印:
{
"attributes": {
"admin": false,"email": "leopold9586@gmail.com","id": 36,"username": "a4qsmr9m"
},"object": "user"
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。