我用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++侧:
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);发布于 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时,应该正确地转义字符串。
https://stackoverflow.com/questions/44808723
复制相似问题