如何解决包含等于“=”且没有引号的字符串转换为 JSON
我目前正在尝试在 javascript 中将字符串转换为 JSON。
我从服务器得到的字符串是:
"{knee=true,centered=true}"
我想要的结果是这样的:
{ knee: true,centered: true}
但是由于字符串使用的是等号并且缺少引号,JSON.parse 不起作用,我不知道如何解决这个问题。任何帮助将不胜感激,谢谢!
解决方法
假设您没有嵌套的事物或带有逗号或括号的字符串,您可以将所有 {
替换为 {"
,将 =
替换为 ":
,以及 { {1}} 与 ,
:
,"
如果没有更多细节,就无法验证这是多么正确,但如果我要做出一些假设:
- 对象是由
{
和}
包围的一组键/值对 - 键/值对由
,
分隔 - 键/值对周围允许有任意空格
- 键和值由
=
分隔 - 值只能保存值
true
或false
,它们应该被转换为 JavaScript 布尔值
...然后解析可以通过一些正则表达式和字符串操作来完成。
const objectRegExp = /^\{(.*)}$/;
function parseNJson(str) { // notJSON
const match = objectRegExp.exec(str);
if (!match) {
throw new Error('This is not NJson');
}
const [,keyValuesBlock] = match;
const keyValueStatements = keyValuesBlock.split(',');
const keyValues = keyValueStatements.map(statement => statement.split('='));
return keyValues.reduce((result,[keyStr,valueStr]) => {
const key = keyStr.trim();
const trimmedValue = valueStr.trim();
let value;
if (trimmedValue === 'true') {
value = true;
} else if (trimmedValue === 'false') {
value = false;
} else {
throw new Error(`Unsupported value ${trimmedValue}`);
}
return Object.assign(result,{ [key]: value });
},{});
}
如果任何假设不正确,这将很容易崩溃,例如“如果值可以是字符串怎么办?如果字符串可以用双引号引起来怎么办?如果它们也可以用单引号括起来怎么办?如果支持数字怎么办?如果支持十六进制数呢?"
如果服务器上发送的数据是标准格式,他们应该能够告诉您“这被格式化为 X”,以便您可以找到符合规范的 X 解析器。或者您可以坚持将数据作为 JSON 发送,因为这是一种超级常见的交换格式。最好的事情是服务器和客户端使用一个通用的、定义良好的消息格式规范,这样你就不会在接收或发送具有你没有考虑的特征的数据时意外破坏。
,我能做的最好的事情就是......它以字符串形式返回对象的值,尽管它似乎工作完美! (实际上这个挑战了我,所以我不得不这样做):-)
let str = "{knee = true,centered = true}";
str = str.replaceAll('{','')
str = str.replaceAll('}','')
str = str.split(",")
str = Object.assign({},str);
let key_value;
let key;
let val;
for (var i = 0; i < Object.keys(str).length; i++) {
key_value = str[i].split("=");
key = String(key_value[0]);
val = key_value[1];
str[i] = val;
delete Object.assign(str,{[key]: str[i]
})[i];
}
console.log(str)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。