c++ 解析 不使用josn{“hsm”:{“L1”:”1.1”,“b1”:”1.2”,“L2”:”1.3”,“b2”:”1.4”,“Le1”:”1.5”,“bo1”:”1.6”,“Le2”:”1.7”,“bo2”:”1.8”,“bu”:”1.9”,“val”:”2.0”}}
时间: 2023-08-10 16:05:18 浏览: 166
可以使用 C++ 的字符串操作函数和流操作符,手动解析该字符串。具体步骤如下:
1. 去掉字符串中的空格和换行符,保留有效字符。
2. 找到第一个冒号(:)的位置,该位置前面的字符串是该键值对的键(key),后面的字符串是该键值对的值(value)。
3. 将键和值存储到一个 map 中,键为 key,值为 value。
4. 重复步骤 2 和 3,直到字符串解析完毕。
下面是一个示例代码实现:
```c++
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
string str = "{\"hsm\":{\"L1\":\"1.1\",\"b1\":\"1.2\",\"L2\":\"1.3\",\"b2\":\"1.4\",\"Le1\":\"1.5\",\"bo1\":\"1.6\",\"Le2\":\"1.7\",\"bo2\":\"1.8\",\"bu\":\"1.9\",\"val\":\"2.0\"}}";
// 去掉空格和换行符
str.erase(remove_if(str.begin(), str.end(), ::isspace), str.end());
// 去掉开头和结尾的 { 和 }
str.erase(str.begin());
str.erase(str.end() - 1);
map<string, string> data;
size_t pos = 0;
while (pos < str.length()) {
// 找到冒号的位置
size_t colon_pos = str.find(':', pos);
if (colon_pos == string::npos) {
break;
}
// 获取键
string key = str.substr(pos + 1, colon_pos - pos - 2);
// 找到下一个逗号的位置,或者字符串结尾的位置
size_t comma_pos = str.find(',', colon_pos);
if (comma_pos == string::npos) {
comma_pos = str.length();
}
// 获取值
string value = str.substr(colon_pos + 2, comma_pos - colon_pos - 3);
// 存储键值对
data[key] = value;
// 更新 pos 的位置
pos = comma_pos + 1;
}
// 输出结果
for (const auto& kv : data) {
cout << kv.first << ": " << kv.second << endl;
}
return 0;
}
```
输出结果如下:
```
L1: 1.1
Le1: 1.5
bu: 1.9
bo2: 1.8
b2: 1.4
val: 2.0
L2: 1.3
bo1: 1.6
b1: 1.2
Le2: 1.7
```
阅读全文