首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析JSON错误: Javascript

解析JSON错误: Javascript
EN

Stack Overflow用户
提问于 2013-03-19 15:00:07
回答 5查看 2.1K关注 0票数 0

我试图使用JSON.parse解析这个字符串。

Ex.

代码语言:javascript
复制
str = "{'xyz': ['300543979001'], 'abc': ['1193'], 'serial_no': ['1'], 'product_tax_amt': ['408.813'], 'product_mrp': ['4699.0'], 'product_qty': ['1.0'], 'contract_type': ['FG'], 'product_tax_rate': ['14.5'], 'is_vat_exclusive': ['True'], 'product_net_amt': ['3228.213'], 'sap_details': [''], 'reference_invoice_no': [''], 'pd': [\"1||9911143976001||18373205-L-I-F-T- RACER WN'S, PINK, 5||11143976||PUMA-18373205-L-I-F-T- RACER WN'S, PINK, 5-5||4699.0||291||629||1||2||41\"], 'topup_offers': ['{}'], 'product_discount_percentage': ['40.0'], 'total_discount_percentage': ['40.0'], 'basic_tax_rate': ['0.0'], 'total_discount_amt': ['1879.6'], 'product_return_qty': ['0.0'], 'product_gross_amt': ['0.0'], 'invoice_no': ['11065011391'], 'product_discount_amt': ['1879.6'], 'is_voided': ['False'], 'supplier_no': ['198'], 'addl_tax_rate': ['0.0'], 'product_cost_amt': ['1.0'], 'code': ['4046643889059']}"

备注::这是单引号&很少有值也可能包含引号,比如[\"1||9911143976001||18373205-L-I-F-T- RACER WN'S, PINK, 5||11143976||PUMA-18373205-L-I-F-T- RACER WN'S, PINK, 5-5||4699.0||291||629||1||2||41\"]

代码语言:javascript
复制
>> JSON.parse(str)

但是它的抛出错误:Unexpected token '

编辑的

我很少尝试用双引号代替这些单引号,

代码语言:javascript
复制
>> str = str.replace(/'/g, '"')
>> JSON.parse(str)

但这会引起错误,

代码语言:javascript
复制
SyntaxError: Unexpected token S

有没有使用regex之类的方法,这样我就可以解析该字符串了吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-20 11:25:23

好的,重点是:如果这是来自服务器的数据,那是一种糟糕的数据格式。它不是有效的JSON,而且它的字符串转义很差。在您的例子中,您可能希望用双引号更改单引号,就像许多人已经建议的那样,但是您有这样可怕的字段:

代码语言:javascript
复制
[\"1||9911143976001||18373205-L-I-F-T- RACER WN'S, PINK, 5||11143976||PUMA-18373205-L-I-F-T- RACER WN'S, PINK, 5-5||4699.0||291||629||1||2||41\"]

现在,理想的解决方案是使用某种正则表达式修复',但是:

( 1)我一辈子找不到一个工作的;

2)我开始认为实际上不可能抓住每一种可能性。

如果我搞错了,我希望有人能纠正我。无论如何,如果真的是这样的话,我认为最简单的方法是最沮丧的一种:可怕的eval()。这个东西可能不是有效的JSON,但它是一个正确的JS对象定义(令人惊讶)。

代码语言:javascript
复制
eval("var data = " + str);

如果需要JSON字符串,可以使用stringify()

代码语言:javascript
复制
var json = JSON.stringify(data);

这是一把有用的小提琴

我必须提前说一句:建议eval()在这个网站上是个糟糕的举动,这是正确的。但是在否决投票之前,请考虑我们有来自服务器的病理数据格式,并且在处理之前没有简单的方法来修复它。我要再说一遍:如果有人能想出一个有效的正则表达式来替换双引号中任意数量的单引号,那肯定是一个更好的方法。

编辑:

如果您确信唯一有问题的字段是pd字段,您可以使用该信息简单地替换该特定字段中的所有单引号。那就安全多了。

票数 2
EN

Stack Overflow用户

发布于 2013-03-19 15:04:47

您的一个字段中有单引号:

代码语言:javascript
复制
9911143976001||18373205-L-I-F-T- RACER WN'S, PINK, 5||11143976**strong text**

试着移除它们,或者逃离它们。

票数 3
EN

Stack Overflow用户

发布于 2013-03-19 15:12:29

根据json.org,您的JSON是错误的

数组是的有序集合。

值可以是双引号中的字符串,也可以是数字,也可以是true、false或null,也可以是对象或数组。

所以你必须用双引号而不是单引号来包装你的字符串。

编辑:

有效的JSON是:

代码语言:javascript
复制
{
  "xyz": [
    "300543979001"
  ],
  "abc": [
    "1193"
  ],
  "serial_no": [
    "1"
  ],
  "product_tax_amt": [
    "408.813"
  ],
  "product_mrp": [
    "4699.0"
  ],
  "product_qty": [
    "1.0"
  ],
  "contract_type": [
    "FG"
  ],
  "product_tax_rate": [
    "14.5"
  ],
  "is_vat_exclusive": [
    "True"
  ],
  "product_net_amt": [
    "3228.213"
  ],
  "sap_details": [
    ""
  ],
  "reference_invoice_no": [
    ""
  ],
  "pd": [
    "1||9911143976001||18373205-L-I-F-T- RACER WN'S",
    "PINK",
    "5||11143976||PUMA-18373205-L-I-F-T- RACER WN'S",
    "PINK",
    "5-5||4699.0||291||629||1||2||41"
  ],
  "topup_offers": [
    "{}"
  ],
  "product_discount_percentage": [
    "40.0"
  ],
  "total_discount_percentage": [
    "40.0"
  ],
  "basic_tax_rate": [
    "0.0"
  ],
  "total_discount_amt": [
    "1879.6"
  ],
  "product_return_qty": [
    "0.0"
  ],
  "product_gross_amt": [
    "0.0"
  ],
  "invoice_no": [
    "11065011391"
  ],
  "product_discount_amt": [
    "1879.6"
  ],
  "is_voided": [
    "False"
  ],
  "supplier_no": [
    "198"
  ],
  "addl_tax_rate": [
    "0.0"
  ],
  "product_cost_amt": [
    "1.0"
  ],
  "code": [
    "4046643889059"
  ]
}

这里JSBin Demo

PS:我不确定在"数组的第一个和最后一个元素中是否应该有pd。如果是这样,只需将\"s添加到这些值中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15502969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档