错误代码到字符串?使用 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,

Django day003

Google API地理编码在运行时使用JavaScript错误

JOptionPane 中的文本换行?

BBS项目 登录界面代码详解