包含等于“=”且没有引号的字符串转换为 JSON

string containing equals "=" and no quotes convert to JSON

我目前无法在 javascript 中尝试将字符串转换为 JSON。

我从服务器获取的字符串是:

"{knee=true, centered=true}"

我正在寻找的结果是这样的:

{ knee: true, centered: true}

但由于字符串使用等号并且缺少引号 JSON.parse 无法正常工作,我不知道如何解决这个问题。任何帮助将不胜感激,谢谢!

假设您没有嵌套的东西或字符串中有逗号或括号,您可以将所有 { 替换为 {",将 = 替换为 ":, , ":

const str = "{knee=true, centered=true}"

console.log(
  JSON.parse(str.split('{').join('{"').split('=').join('":').split(', ').join(', "'))
)

如果没有更多细节,就无法验证这是多么正确,但如果我要做出一些假设:

  • 一个对象是由 {}
  • 包围的一组 key/value 对
  • Key/value 对由 ,
  • 分隔
  • key/value 对
  • 周围允许任意空格
  • 键和值由 =
  • 分隔
  • Values 只能包含值 truefalse,应将其转换为 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 发送数据,因为这是一种非常常见的交换格式。最好的事情是服务器和客户端使用一个通用的、定义良好的消息格式规范,这样你就不会在接收或发送具有你没有考虑到的特征的数据时意外破坏。

我能做的最好的就是这个...它 returns 对象在字符串中的值,尽管它看起来很完美! (实际上这个挑战我,所以我不得不这样做):-)

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)