0

尝试使用nlohmann/json解析一些 CBOR 有效负载:

#include <iostream>
#include <nlohmann/json.hpp>

using json = nlohmann::json;

int main()
{
    uint8_t data[] = {0xa2, 0x43, 0x72, 0x65, 0x74, 0x81, 0x0d, 0x47,
                      0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0xf5};

    json jresp = json::from_cbor(data, data + (sizeof data / sizeof data[0]));

    return 0;
}

失败并出现此错误:

libc++abi.dylib:以 nlohmann::detail::parse_error 类型的未捕获异常终止:[json.exception.parse_error.113] 在字节 2 处解析错误:解析 CBOR 字符串时出现语法错误:预期长度规范(0x60-0x7B ) 或不定字符串类型 (0x7F);最后一个字节:0x43

我尝试了其他解码器,它们能够解码该有效载荷。

Python 的cbor包能够对其进行解码:

import cbor
print(cbor.loads(b"\xa2\x43\x72\x65\x74\x81\x0d\x47\x73\x75\x63\x63\x65\x73\x73\xf5"))

{b'ret':[13],b'success':真}

cbor.me 的CBOR游乐场能够对其进行解码:

16 字节:

A2                   # map(2)
   43                # bytes(3)
      726574         # "ret"
   81                # array(1)
      0D             # unsigned(13)
   47                # bytes(7)
      73756363657373 # "success"
   F5                # primitive(21)

诊断:

{'ret': [13], 'success': true}

是否有一些标志可以传递给nlohmann/json以使其解码?

试图通过无济于事strict=falsejson::from_cbor()

4

1 回答 1

0

我没有使用 CBOR 的经验,但它似乎不会阻止您使用二进制字符串、整数等作为 JSON 键。

在您的情况下,输入数据用于0x43定义 3 字节二进制密钥,而不是预期0x63的 3 字节字符串。类似的东西success

使用{0xa2, 0x63, 0x72, 0x65, 0x74, 0x81, 0x0d, 0x67, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0xf5};nlohmann/json 效果很好。

cbor.me 区分二进制字符串(单引号)和文本字符串(双引号)。JSON 需要/需要字符串的双引号,并且 JSON 键被定义为字符串:https ://www.json.org/json-en.html

另请参阅:https ://stackoverflow.com/a/4162651/4181011


编辑:

你有什么:

JSON CBOR
{'ret': [13], 'success': true} A2 # map(2)
43 # bytes(3)
726574 # "ret"
81 # array(1)
0D # unsigned(13)
47 # bytes(7)
73756363657373 # "success"
F5 # primitive(21)

你想要/需要什么:

JSON CBOR
{"ret": [13], "success": true} A2 # map(2)
63 # text(3)
726574 # "ret"
81 # array(1)
0D # unsigned(13)
67 # text(7)
73756363657373 # "success"
F5 # primitive(21)

编辑2:

您的 JSON 无效。错误消息是这样说的。在字节 2 处,解析器需要一个字符串,该字符串在 CBOR 中由字符串 length 引入(0x60-0x7B) or indefinite string type (0x7F)

您的 CBOR 有效负载不会引入字符串而是字节。这就是它被解析器拒绝的原因。0x43不是字符串的有效类型/长度标识符,此时 JSON 需要字符串。

于 2021-02-09T11:18:57.023 回答