【问题标题】:Extract characters in between Special characters using stringstream in C++在 C++ 中使用字符串流提取特殊字符之间的字符
【发布时间】:2021-08-06 11:27:54
【问题描述】:

我从 API 获取 JSON {"Success":true,"Error":null,"Result":null} 对象,并且我使用字符串流来提取我需要的数据。这个对象在下面的代码中被传递为temp

我知道有一些库可用于处理 JSON,但我想在不使用库的情况下解析它。

我曾推荐过How to deserialize json string in c++ without using any third party library。在我遇到特殊字符之前它运行良好。

                std::stringstream ss(temp); //Using Json response stream
                const unsigned int BUFFERSIZE = 1087;
                //temporary buffer
                char buffer[BUFFERSIZE];
                memset(buffer, 0, BUFFERSIZE * sizeof(char));
                std::pair<std::string, std::string> returnValue;
                while (ss.peek() != '{')
                {
                    ss.ignore();
                }
                while (ss.peek() != '}' && value == "")
                {
                    ss.get(buffer, BUFFERSIZE, '\"');
                    ss.ignore();
                    ss.get(buffer, BUFFERSIZE, '\"');
                    ss.ignore();
                    returnValue.first = buffer;
                    ss.get(buffer, BUFFERSIZE, ':');
                    ss.ignore();
                    ss.get(buffer, BUFFERSIZE, ',');
                    ss.ignore();
                    returnValue.second = buffer;
                    cout << returnValue.second;
                    if (returnValue.first == "Success") {
                        value = buffer;
                    }
                }

我正在尝试提取介于":""," 之间的值true,但我得到一个空字符串。

我错过了什么吗?

【问题讨论】:

  • 请注意,相同的buffer 会传递给所有get 调用。
  • 如果你删除ss.get(buffer, BUFFERSIZE, ':');,它会起作用,但我不知道为什么......
  • 似乎ss.get(buffer, BUFFERSIZE, ':');,当 ss 中的第一个字符是 : 时,并没有删除 nothing(因为它应该这样做),它吃掉了整个ss、冒号和所有的内容。这似乎不是特定于 ':',如果我们使用另一个字符就会发生。这可能是stringstream::get 中的错误吗?
  • 如果你“想在不使用库的情况下解析它”,那么不要“我参考过......”

标签: c++ json parsing stringstream


【解决方案1】:

当执行以下行时:

ss.get(buffer, BUFFERSIZE, ':');

ss 的内容类似于":true, ...",这意味着准备提取的第一个字符确实是':'

std::stringstream 继承自std::basic_istream 函数get。我们可以在en.cppreference(强调我的)找到参考文档:

从流中提取一个或多个字符。
所有版本都表现为UnformattedInputFunctions。在构造并检查哨兵对象后,这些函数执行以下操作:
[...]
4) 读取字符并将它们存储到第一个元素由 s 指向的字符数组的连续位置中。字符被提取和存储,直到发生以下任何一种情况:

  • count-1 个字符已存储
  • 输入序列中出现文件结束条件(调用 setstate(eofbit))
  • 下一个可用的输入字符 c 等于 delim,Traits::eq(c, delim) 确定。 未提取此字符(与 basic_istream::getline() 不同)

如果没有提取字符,则调用 setstate(failbit)。 在任何情况下,如果 count>0,则将空字符(CharT() 存储在数组的下一个连续位置。

只要设置了failbit,对该流的所有后续操作都会失败。

您可以使用clear() 来恢复或实现完全不同的算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 2017-09-02
    • 1970-01-01
    • 2021-07-18
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    相关资源
    最近更新 更多