0

我正在尝试使用JSON.parse.

前任。

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\"]

>> JSON.parse(str)

但它的抛出错误:Unexpected token '

已编辑

我在这里和那里尝试了一些用双引号替换这些单引号的东西,

>> str = str.replace(/'/g, '"')
>> JSON.parse(str)

但随后它会引发错误,

SyntaxError: Unexpected token S

有什么方法可以使用regex或其他东西,所以我可以解析那个字符串吗?

4

5 回答 5

3

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

9911143976001||18373205-L-I-F-T- RACER WN'S, PINK, 5||11143976**strong text**

尝试删除它们,或逃避它们。

于 2013-03-19T15:04:47.087 回答
2

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

[\"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\"]

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

1)我一辈子都想不出一个可以工作的人;

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

如果我对此有误,我希望有人能纠正我。无论如何,如果真的是这样,我认为最简单的方法是最气馁的一种:dreadful eval()。那东西可能不是有效的 JSON,但它(令人惊讶)是一个正确的 JS 对象定义。

eval("var data = " + str);

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

var json = JSON.stringify(data);

这是一个工作小提琴

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

编辑:

If you are sure that the only problematic field is the pd one, you could use that information to simply replace all single quotes in that particular field. That would be much safer.

于 2013-03-20T11:25:23.933 回答
1

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

数组是的有序集合...

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

因此,您必须将字符串用双引号而不是单引号括起来。


编辑:

一个有效的JSON将是:

{
  "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:我不确定数组"的第一个和最后一个元素中是否应该有 s 。pd如果是这样,只需将\"s 添加到这些值。

于 2013-03-19T15:12:29.593 回答
1

JSON 字符串用双引号"字符分隔。您正在使用单引号字符,这在 JavaScript 文字中是合法的,但在 JSON 中是不合法的。

当您手工制作 JSON 时,使用JSON Lint (它会发现此错误)之类的工具来测试它是很有用的。(通常您应该使用经过良好测试的库函数来生成 JSON)。

于 2013-03-19T15:12:54.917 回答
-1

使用单引号(' ')是不好的做法——你最好使用双引号(" ")。 例如:Literals

 var str = '{ "foo": "bar" }';
 var json = JSON.parse(str); 
 json['foo']
于 2013-03-19T15:06:25.167 回答