【问题标题】:string containing equals "=" and no quotes convert to JSON包含等于“=”且没有引号的字符串转换为 JSON
【发布时间】:2021-08-28 18:03:45
【问题描述】:

我目前正试图在 javascript 中将字符串转换为 JSON。

我从服务器得到的字符串是:

"{knee=true, centered=true}"

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

{ knee: true, centered: true}

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

【问题讨论】:

  • 你有更多关于这种格式细节的细节吗?除非您知道字符串的内容可能包含什么,否则不可能编写出好的解析器。
  • 这不是有效的 JSON。请您考虑修复源代码吗?
  • @evolutionxbox 据我了解,服务器发送了无效的 JSON 格式,问题是如何在客户端修复它。甚至在问题中描述了该字符串不是有效的 JSON。
  • @jabaa 明白了。从源头上修复它总是更好。

标签: javascript json stringify


【解决方案1】:

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

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)

【讨论】:

    【解决方案2】:

    假设您没有包含逗号或括号的嵌套内容或字符串,您可以将所有{ 替换为{",将= 替换为":,并将, 替换为, "

    const str = "{knee=true, centered=true}"
    
    console.log(
      JSON.parse(str.split('{').join('{"').split('=').join('":').split(', ').join(', "'))
    )

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 非常感谢您的回答!!我从服务器获取的数据看起来就像我每次给出的示例,所以我需要做的解析只需要配置一次,每次调用数据时它都应该工作。
      猜你喜欢
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      • 2021-12-27
      相关资源
      最近更新 更多