'"
Json::Value root;
Json::Reader reader;
const std::string json_str1 = "{\"name\":\"Say \\\"Hello\\\"!\"}";
const std::string json_str2 = "{\"name\":\"Say \"Hello\"!\"}";
const std::string json_str3 = "{\"name\":\"Say \\\'hi\\\'!\"}";
const std::string json_str4 = "{\"name\":\"Say \'hi\'!\"}";
const std::string json_str5 = "{\"name\":\"Say 'hi'!\"}";
reader.parse(json_str1, root, false); // success
reader.parse(json_str2, root, false); // fail
reader.parse(json_str3, root, false); // fail
reader.parse(json_str4, root, false); // success
reader.parse(json_str5, root, false); // success
为什么双引号必须像
\\\"
,但单引号必须是\'
或只是'
,但不能是\\\'
?最佳答案:
\""\
const std::string double_quote = """; // WRONG!
const std::string double_quote = "\""; // good
有两个解析器
在您的代码中,涉及两个解析器:C ++解析器(将在C ++编译器中编译此代码)和JSON解析器(在jsoncpp库中)。 C ++解析器在编译时解释此代码,而jsoncpp解析器在运行时解释字符串。
与C ++一样,JSON也使用双引号
"
分隔字符串。 jsoncpp解析器可以看到一个简单的JSON文档,如下所示:{"name":"Xiaoying"}
要将此JSON文档封装到C ++字符串中,需要使用
"
对JSON文档中的双引号\
进行转义,如下所示:const std::string json_name = "{\"name\":\"Xiaoying\"}"; // good
这告诉C ++创建具有内容
{"name":"Xiaoying"}
的字符串。嵌套定界符
当JSON文档本身包含必须同时转义的定界符时,事情就变得复杂起来。与C ++一样,JSON也将反斜杠
\
用作转义符。现在的问题是,如何区分用作jsoncpp解析器转义的反斜杠\
和用作C ++解析器转义的反斜杠\
?执行此操作的方法是使用双反斜杠\\
序列,C ++解析器将其转换为字符串内的单个反斜杠'\'
字符。该单个反斜杠在运行时传递给jsoncpp解析器时,将在那时被解释为转义字符。JSON中反斜杠的使用规则与C ++的规则不同,这使事情变得更加复杂。特别是,在C ++中,单引号
'
可以用反斜杠转义(如\'
),但这不是JSON中的合法模式。这是您介绍的五个案例中的每一个的解释:
1. json_str1
C ++语句
const std::string json_str1 = "{\"name\":\"Say \\\"Hello\\\"!\"}";
产生一个看起来像
{"name":"Say \"Hello\"!"}
当jsoncpp解析器看到此消息时,它将通过反斜杠知道
"Say \"Hello\"!"
表示这是一个包含Say "Hello"!
的字符串2. json_str2
C ++语句
const std::string json_str2 = "{\"name\":\"Say \"Hello\"!\"}";
产生一个看起来像
{"name":"Say "Hello"!"}
由于
"Hello"
周围的引号不会转义,因此jsoncpp解析器将失败。3. json_str3
C ++语句
const std::string json_str3 = "{\"name\":\"Say \\\'hi\\\'!\"}";
产生一个看起来像
{"name":"Say \'hi\'!"}
由于
\'
模式在JSON中无法识别,因此在jsoncpp解析器中将失败。4. json_str4
C ++语句
const std::string json_str4 = "{\"name\":\"Say \'hi\'!\"}";
产生一个看起来像
{"name":"Say 'hi'!"}
这是因为C ++解析器将
\'
序列解释为单个'
字符。5. json_str5
C ++语句
const std::string json_str5 = "{\"name\":\"Say 'hi'!\"}";
产生一个看起来像
{"name":"Say 'hi'!"}
也可以看看
对于C ++转义序列规则:http://en.cppreference.com/w/cpp/language/escape
对于JSON转义序列规则:http://www.json.org/