CBOR 序列化(字符串转义)

CBOR serialization (string escaping)

我使用 nlohmann::json 库在 C++ 中使用 CBOR 序列化一个 JSON 对象,我的用例涉及读取 c# 中的 cbor 字节字符串输出。我注意到,当使用 nlohmann::json 库将 json 对象转储到 C++ 中的字符串时,json 字符串值(即大小写 value_t::string)被转义(a调用 escape_string),当 json 值是 CBOR 方法中的字符串值时,不会进行此类调用。

我正在阅读 CBOR CRF 7049,似乎在序列化为 CBOR 时不需要对字符串进行转义。 nlohmann::json 库中的行为是一致的:字符串在序列化时不会转义,反序列化时也不会被转义。 但似乎 Newtonsoft.Json(C# 库)期望如此。这是一个有效的期望吗?还是我在这个过程中做错了什么?

C++ 端:

nlohmann::json json_doc;
json_doc["characters"] = nlohmann::json::array();

for (int i = 0; i < characters.size(); i++) {
    json_doc["characters"][i]["name"] = (characters[i] != nullptr) ? characters[i]->name() : "";
}

std::vector<uint8_t> cbor = nlohmann::json::to_cbor(json_doc);
output->assign((char*)&cbor[0], cbor.size());

C# 端。 cbor_bytes是cbor字节串(c++输出向量)

CBORObject cbor = CBORObject.DecodeFromBytes(cbor_bytes);
output = cbor.ToString();

这样的输出字符串格式错误:

{"characters": [{"name": "Clara Oswald"}, {"name": "Kensi Blye"}, {"name": "Temperance "Bones" Brennan"}]}

显然无法解析:

JObject output_obj = JObject.Parse(output);

CBOR (Concise Binary Object Representation) is not JSON(JavaScript 对象表示法)。尽管 CBOR 可能借鉴了 JSON 的一些概念,但它显然是一种具有不同规则和目标的不同格式。 CBOR 是一种二进制格式; JSON 是文本。在 CBOR 中,字符串有长度前缀,而在 JSON 中则没有。此外,CBOR 不允许元素之间有任意空格(这对二进制格式没有意义),而 JSON 允许(为了人类可读性)。最终,CBOR 不需要转义字符串的机制,因为它不需要定界符来区分字符串的开始和结束位置。另一方面,JSON 需要双引号来标记每个字符串的开头和结尾。因此,字符串 中的引号和控制字符必须 与 JSON 中的反斜杠以及文字反斜杠本身进行转义。如果您想确保 JSON 可解析,则无法绕过此规则。

在上面的代码中,您使用 CBORObject.ToString() 方法将对象转换为字符串。如果此 CBORObject 来自第三方库,文档是否说明 ToString() 将生成有效的 JSON?如果是这样,那么它肯定有错误;它应该按照 JSON 规范的要求进行适当的转义。如果没有这样的有效 JSON 承诺,那么您就不能指望 Json.Net 能够解析字符串,即使它看起来有点像 JSON。 (您可能会检查 CBORObject 是否有一些其他专用方法,例如 ToJson() 来执行此转换。)如果 CBORObject 是您自己的代码,那么您就可以对字符串进行转义从 CBOR 转换为 JSON.

时正确