首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CBOR序列化(字符串转义)

CBOR序列化(字符串转义)
EN

Stack Overflow用户
提问于 2017-06-28 17:07:18
回答 1查看 2.2K关注 0票数 0

我用nlohmann::json库在C++中序列化一个JSON对象,我的用例包括在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++侧:

代码语言:javascript
复制
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++输出向量)。

代码语言:javascript
复制
CBORObject cbor = CBORObject.DecodeFromBytes(cbor_bytes);
output = cbor.ToString();

到那时,这种输出字符串的格式是错误的:

代码语言:javascript
复制
{"characters": [{"name": "Clara Oswald"}, {"name": "Kensi Blye"}, {"name": "Temperance "Bones" Brennan"}]}

显然不能被解析:

代码语言:javascript
复制
JObject output_obj = JObject.Parse(output);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-28 21:41:12

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时,应该正确地转义字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44808723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档