gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:46:28 37 4
gpt4 key购买 nike

我在这里使用jsoncpp库。我对单引号(')和双引号(")的解析感到困惑。

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

为什么双引号必须像 \\\"而单引号必须是 \'或仅仅是 ',但不能是 \\\'

最佳答案

转义分隔符

使用\转义引号的原因是为了使解析器能够区分要用作引号字符串内字符的引号和旨在关闭字符串的定界引号。

如您所知,在C++语言中,双引号"用于分隔字符串。但是,如果要创建一个包含双引号"的字符串,那么\用作转义符,因此C++解析器知道将以下字符解释为字符,而不是结束定界符:

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/

关于c++ - 解析在jsoncpp中具有嵌套转义序列的引用字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34084156/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com