【问题标题】:CBOR serialization (string escaping)CBOR 序列化(字符串转义)
【发布时间】:2017-06-28 17:07:18
【问题描述】:

我在 C++ 中使用 nlohmann::json 库对 JSON 对象进行 CBOR 序列化,我的用例涉及读取 c# 中的 cbor 字节字符串输出。我注意到,当使用 nlohmann::json 库将 json 对象转储到 C++ 中的字符串时,json 字符串值(即 case value_t::string)被转义(调用了 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);

【问题讨论】:

    标签: c# json serialization json.net cbor


    【解决方案1】:

    CBOR(简明二进制对象表示)不是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。

    【讨论】:

    • CBORObject 来自 PeterO.Cbor 库。你说得对。除了 ToString(),还有另一个方法叫 ToJSONString(),这是我应该调用的。
    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多