【问题标题】:JSON.parse not creating a json object in javascriptJSON.parse 未在 javascript 中创建 json 对象
【发布时间】:2019-02-20 11:02:27
【问题描述】:

我从上游得到低于字符串。无法控制它。

b"{'text': 'Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)', 'sentiment': '0.25'}"

我想将字符串更改为 JSON。所以我做的第一件事就是删除前面的 b'....' (上游是一个 python 程序,它产生 utf-8 字符串作为输出)。所以我正在使用 substr 删除 'b' ..

str = msg.payload.substr(1);

然后我尝试使用 JSON.stringifyJSON.parse 将字符串转换为 JSON。

console.log(typeof(str));
var t = JSON.stringify(str);
console.log(typeof(t));
var t = JSON.parse(t);
console.log("First:  " + t);
var t = JSON.parse(t);
console.log("Second  " + t);
x = t.text;
y = t["text"];
console.log(x + " ---- " + y);

控制台输出:

string
string
First:  "{'text': 'Airtel Tower(@ KT Tower in Bang, Greater K
n), 'sentiment': '0.25'}"
Second  {'text': 'Vodafone Tower (@ LT Tower in Delhi, Greater K
), 'sentiment': '0.25'}
undefined ---- undefined

即使 JSON.stringify 删除了多余的引号等,并且 JSON.parse 似乎不起作用,它也无法将其转换为对象。我做错了什么?

【问题讨论】:

  • 您还必须将 ' 替换为 ",因为 JSON 仅支持双引号。
  • 您的Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)' 开头不是缺少单引号' 吗?
  • 我不知道 1 票赞成,因为有问题的数据本身是错误的
  • 我在错误复制时删除了丢失的单引号。现在更新了。 @molamk

标签: javascript json serialization


【解决方案1】:

const input = "b'\"{'text': 'Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)', 'sentiment': '0.25'}\"'";

const cleanString = str => str.split('"')[1].replace(/'/g, '"');

console.log(input);

// Result
console.log(JSON.parse(cleanString(input)));

说明

  1. Split the string 带有 双引号 " 作为分隔符
  2. 获取第二个项目。这会给你{'text': 'Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)', 'sentiment': '0.25'}
  3. Replace 单引号 '双引号 "。这会给你{"text": "Airtel Tower (@ BT Tower in Chasdmzoa, Delhi)", "sentiment": "0.25"}
  4. 在前一个字符串上调用 JSON.parse 以获取您的对象

【讨论】:

  • 解释有帮助。
【解决方案2】:

这里有一个问题:单引号字符串文字不是有效的 JSON。 JSON 基于 JavaScript,但不是一回事。如果您在 JavaScript 代码中编写对象字面量,那很好;如果你真的需要 JSON,你需要使用 ".

【讨论】:

    【解决方案3】:

    最简单的答案(针对非反eval-zealots):

    var string = msg.payload.substring(3,msg.payload.length-2);
    var t = eval("(" + string + ")");
    

    如果受不了,或者不能使用(严格模式?)eval,那么需要将单引号转成双引号进行解析,因为JSON只接受双引号:

    var string = msg.payload.substring(3,msg.payload.length-2);
    var t = JSON.parse(string.replace(/'/g, "\""));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-14
      • 2019-08-04
      • 2015-12-28
      • 2016-10-28
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多