【问题标题】:cpprestsdk fails parsing with backslashcpprestsdk 使用反斜杠解析失败
【发布时间】:2020-11-18 10:26:18
【问题描述】:
  wstring  str1 = L"\"address\":\"test \ 00001\",\"type\":\"Float\""
  wstring  str2 = L"\"address\":\"test \\ 00001\",\"type\":\"Float\""
  wstring  str3 = L"\"address\":\"test \\\ 00001\",\"type\":\"Float\""
  wstring  str4 = L"\"address\":\"test \\\\ 00001\",\"type\":\"Float\""

JSON 解析在前三种情况下失败并返回 address=test \\ 0001 type=Float 但我只希望地址中有一个反斜杠,如何解决这个问题?

【问题讨论】:

  • c++ 解析器吃一层反斜杠,如果您希望最终解析的值包含单个反斜杠,JSON 预计会看到双反斜杠。如果需要,您可以使用原始 C++ 字符串文字来摆脱一级转义。
  • 我已经用 L 表示宽字符串
  • 不,那仍然是不同的东西。请参阅cpp referencethis SO question 的第 6 项

标签: c++ casablanca cpprest-sdk


【解决方案1】:

我需要对字符串文字中的某些字符进行转义的每种语言。在 C++ 中,转义序列以 \ 开头,后跟要表示的字符的转义值。

str1 = "\"address\":\"test \ 00001\",\"type\":\"Float\"" 中,\ (00001 之前的那个)是\040040 用于空格),这是一个未知的转义序列,因此该转义序列被忽略,并将导致:

"address":"test \ 00001","type":"Float"

对于str2 = "\"address\":\"test \\ 00001\",\"type\":\"Float\""\\\ 的一个 vlaid 转义序列,结果是: "address":"test \ 00001","type":"Float"

对于str3 = "\"address\":\"test \\\ 00001\",\"type\":\"Float\""\ (00001 之前的那个)与第一种情况相同。而\\ 才有效。所以结果是:

"address":"test \\ 00001","type":"Float"

对于str4 = "\"address\":\"test \\\\ 00001\",\"type\":\"Float\"",转义序列是正确的,结果如下:

"address":"test \\ 00001","type":"Float"

这个字符串再一次被 JSON 解析解析,\ 也被用作转义序列的开始,所以在解析这个结果 "address":"test \\ 00001","type":"Float" 之后,你会得到 "test \ 00001"address

这就是您不想手动构建数据的 JSON 表示的原因之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多