错误代码到字符串?使用 error_message 构造为 json
Posted
技术标签:
【中文标题】错误代码到字符串?使用 error_message 构造为 json【英文标题】:Error code to string? Struct to json with error_message 【发布时间】:2022-01-04 14:03:59 【问题描述】:我正在用 C++ 开发一个程序,该程序从 DLL 中返回要在网页中使用的信息。 DLL 返回一个包含信息的大结构,但只需要我计划使用https://github.com/nlohmann/json 以 json 格式返回的一些字段,然后返回 char*。
这是一个结构示例和每个字段的值的含义(根据文档 pdf)
struct myStruct
BYTE StatusCode;
BYTE ErrorCode;
DWORD WarningCode[2];
otherStruct SystemInfo[16];
...
StatusCode:
0x00 = No Error
0x01 = Error
0x02 = Ready
...
0x05 = Power Off
WarningCode
0x00 0x00 = No warning
0x02 0x01 = Warning Alert
... etc
这是我访问结构字段的方式:
GetInfoStatus(&myStatusStruct);
jInfo["error_code"] = myStatusStruct.ErrorCode;
jInfo["status_code"] = myStatusStruct.StatusCode;
jInfo["warning_code"] = myStatusStruct.WarningCode2;
jInfo["is_available_warning_code"] = myStatusStruct.AvailableWarningCode2;
std::string info = jInfo.dump();
return info.c_str();
// My current return char* "json"
// "available_warning_code":1,"error_code":255,"status_code":4
但我想要这样的东西
"available_warning_code": [0x01, "warning_alert"], "error_code": [0x01, "error_system_fail"], "status_code": [0x04, "low_battery"]
或类似的,因此我也可以将错误代码返回到指示含义(翻译)的“字符串”或“error_message”,以便我的后端/前端(NodeJS)稍后可以检测到“low_battery”并对其进行处理,而不必将 0x04 与表匹配来理解 0x04(与其他键中的其他 0x04 不同)
我检查了这个解决方案https://***.com/a/208003/4620644,但仍然不明白是否最适合我的情况以及如何实施它。我有 20 个错误代码、10 个警告代码、15 个状态代码。
【问题讨论】:
【参考方案1】:您可以创建一个std:pair
并在 json 中使用它。但是,在某个地方,您将不得不输入所有错误消息。
#include <iostream>
#include <vector>
#include <string>
#include <utility>
#include "json.h"
using namespace nlohmann;
std::pair<int, std::string> make_error(int error)
// Use a vector if error codes are sequential
// Otherwise, maybe a switch
std::vector<std::string> error_msgs =
"No Error", "Error", "Ready"
;
if (error >= 0 && error < error_msgs.size())
return std::make_pair(error, error_msgs[error]);
else
return std::make_pair(error, "Unknown");
int main()
json jInfo;
jInfo["error_code"] = make_error(2);
std::cout << jInfo.dump();
return 0;
这个输出:
"error_code":[2,"Ready"]
您也必须对其他字段执行此操作。
【讨论】:
【参考方案2】:获取错误字符串
class CodeMap
map<pair<int, int>, string> m_warningCodes
make_pair(0,0), "No warning",
make_pair(2,1), "Warning Alert"
;
map<int, string> m_statusCode
0, "No Error",
1, "Error",
2, "Ready",
5, "Power Off",
;
public:
std::string GetWarningCode(int code[])
return m_warningCodes[make_pair(code[0], code[1])];
std::string GetStatusCode(int code)
return m_statusCode[code];
;
json 中的十六进制不符合 RFC 7159
https://github.com/nlohmann/json/issues/249
方法1:十六进制字符串
从 int 类型获取十六进制
//with c++ 20 std::format can be used instead below function
std::string GetHex(int i)
std::stringstream stream;
stream << "0x" <<std::hex << i;
return stream.str();
将键值对分配给json字段
CodeMap m; //To get message string
jInfo["error_code"] = make_pair(GetHex(myStatusStruct.ErrorCode), "error_system_fail");
jInfo["status_code"] = make_pair(GetHex(myStatusStruct.StatusCode), m.GetStatusCode(myStatusStruct.StatusCode));
输出:
"error_code": ["0x01", "error_system_fail"], "status_code": ["0x04", "low_battery"]
方法 2:十六进制为整数
将键值对分配给json字段
CodeMap m; //To get message string
jInfo["error_code"] = make_pair(myStatusStruct.ErrorCode, "error_system_fail");
jInfo["status_code"] = make_pair(myStatusStruct.StatusCode, m.GetStatusCode(myStatusStruct.StatusCode));
输出:
"error_code": [1, "error_system_fail"], "status_code": [4, "low_battery"]
【讨论】:
以上是关于错误代码到字符串?使用 error_message 构造为 json的主要内容,如果未能解决你的问题,请参考以下文章
django 没有在表单中显示 error_messages
Instagram oauth api 给出 "error_message": "匹配代码未找到或已被使用。", "code": 400,