'"
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/