C++ 解析jsoncpp中具有嵌套转义序列的引用字符串

C++ 解析jsoncpp中具有嵌套转义序列的引用字符串,c++,json,string,escaping,jsoncpp,C++,Json,String,Escaping,Jsoncpp,我正在使用这里的图书馆。对单引号(”)和双引号(“)的解析让我感到困惑 为什么双引号必须像\\\”,但单引号必须是\'或只是',但不能是\\'?转义分隔符 使用\转义引号的原因是,允许解析器区分要作为带引号字符串中的字符的引号和要关闭字符串的分隔引号 正如您所知,在C++语言中,双引号 用于分隔字符串。但是如果要创建包含双引号“/Cuth>”的字符串,则使用 \/Cube >作为一个转义,因此C++分析器知道将以下字符解释为字符,而不是作为结束分隔符: const std::string dou

我正在使用这里的图书馆。对单引号(
)和双引号(
)的解析让我感到困惑

为什么双引号必须像
\\\”
,但单引号必须是
\'
或只是
'
,但不能是
\\'

转义分隔符 使用
\
转义引号的原因是,允许解析器区分要作为带引号字符串中的字符的引号和要关闭字符串的分隔引号

正如您所知,在C++语言中,双引号<代码> 用于分隔字符串。但是如果要创建包含双引号“/Cuth>”的字符串,则使用 \/Cube >作为一个转义,因此C++分析器知道将以下字符解释为字符,而不是作为结束分隔符:

const std::string double_quote = """;     // WRONG!


有两个解析器 <>在代码中,有两个解析器:C++编译器,它是编译此代码的C++编译器的一部分,JSON解析器是JSONCPP库的一部分。C++分析器在编译时解释此代码,而JSONCPP分析器在运行时解释字符串。

类似C++,JSON也使用双引号<代码> 分隔字符串。JSONCPP分析器所看到的简单JSON文档看起来类似:

{"name":"Xiaoying"}

将JSON文档封装为C++字符串,JSON文档中的双引号 >代码>需要用<代码> \/> >如下:

const std::string json_name = "{\"name\":\"Xiaoying\"}";    // good

这告诉C++创建一个字符串,它的内容是代码> {名称“:”小颖}} /Cuth>。

嵌套分隔符 当JSON文档本身包含也必须转义的分隔符时,事情开始变得复杂起来。与C++一样,JSON也使用反斜杠<代码> \/COD>作为一个转义。现在问题变成了,如何区分反斜杠<代码> \/COMP>,作为JSONCPP解析器的一种逃避,从反斜杠<代码> \/COD>中作为C++解析器的一个逃逸?这样做的方法是使用一个双反斜杠<代码> \\/COD>序列,它由C++解析器翻译成字符串中的一个反斜杠<代码> \ '/COD>字符。当在运行时传递给jsoncpp解析器时,该反斜杠将被解释为转义字符

的反斜杠使用规则不同于C++规则,这使得事情变得更加复杂。特别是,在C++中,单引号<代码> \/C>可以用反斜杠(如<代码> \代码> >中进行),但这不是JSON中的一种合法模式。 以下是您介绍的五个案例的解释:

1。json_str1

C++语句

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'!\"}";
生成一个JSON文档,看起来像

{"name":"Say \"Hello\"!"}
{"name":"Say "Hello"!"}
{"name":"Say \'hi\'!"}
{"name":"Say 'hi'!"}
{"name":"Say 'hi'!"}
当jsoncpp解析器看到这一点时,它将通过反斜杠知道
说“你好”!“
意味着这是一个包含
说“你好”的字符串


2。json_str2

C++语句

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'!\"}";
生成一个JSON文档,看起来像

{"name":"Say \"Hello\"!"}
{"name":"Say "Hello"!"}
{"name":"Say \'hi\'!"}
{"name":"Say 'hi'!"}
{"name":"Say 'hi'!"}
由于
“Hello”
周围的引号没有转义,因此jsoncpp解析器将失败。

3。json_str3

C++语句

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'!\"}";
生成一个JSON文档,看起来像

{"name":"Say \"Hello\"!"}
{"name":"Say "Hello"!"}
{"name":"Say \'hi\'!"}
{"name":"Say 'hi'!"}
{"name":"Say 'hi'!"}
由于JSON中无法识别
\'
模式,因此在jsoncpp解析器中这将失败。

4。json_str4

C++语句

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'!\"}";
生成一个JSON文档,看起来像

{"name":"Say \"Hello\"!"}
{"name":"Say "Hello"!"}
{"name":"Say \'hi\'!"}
{"name":"Say 'hi'!"}
{"name":"Say 'hi'!"}
<>这是因为C++分析器将<代码> \/COD>序列解释为单个<代码> 字符。

5。json_str5

C++语句

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'!\"}";
生成一个JSON文档,看起来像

{"name":"Say \"Hello\"!"}
{"name":"Say "Hello"!"}
{"name":"Say \'hi\'!"}
{"name":"Say 'hi'!"}
{"name":"Say 'hi'!"}

另见 < C++逃逸序列规则>

对于JSON转义序列规则:



谢谢!这个答案很有帮助。另外,如果我想要一个JSON文档,它看起来像
{“date”:“9/4”}
。C++语句可以类似于<代码> { \\DATE \:\“9 \ 4”}“< /C>”,但是<代码> {“日期”\ \ \“9 \ 4”}“/Calp>会引发一个未知的转义序列:‘\’警告。是因为<代码> \//COD>是JSON转义序列,而不是C++转义序列吗?