2013-03-19 158 views
0

我试图用JSON.parse解析这个字符串。解析JSON错误: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\"]

>> JSON.parse(str) 

但其投掷的错误:Unexpected token '

EDITED

我想在这里很少有东西用双引号替换这些单引号,

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

但随后引发错误,

SyntaxError: Unexpected token S 

是否有使用regex什么的任何方式,所以我可以解析那个字符串?

+4

您需要双引号(''')而不是单引号(''')。当然,这意味着您必须在字符串中将它们转义,如'\“'。 – Aioros 2013-03-19 15:02:47

+0

那个数据由服务器响应,现在该如何解决这个问题,所以我们可以解析一下呢? – 2013-03-19 18:46:28

+0

我刚刚添加了一个答案,看看它是否适合你。但我仍然希望有人有更好的一个。 – Aioros 2013-03-20 11:26:00

回答

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

现在,理想的解决办法是用某种固定的'小号正则表达式,但:

1)我不能为我的生活找出一个工作的;

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

我希望有人会纠正我,如果我对此有错。无论如何,如果实际情况如此,我认为最简单的方法是最沮丧的方式:可怕的eval()。这件事可能不是有效的JSON,但它(令人惊讶的)是一个正确的JS对象定义。

eval("var data = " + str); 

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

var json = JSON.stringify(data); 

Here is a working fiddle

我不得不说这个提前:建议eval()是一个可怕的举动,在这个网站上,这是对的。但在downvoting之前,请考虑我们有从服务器的病理数据格式,并没有简单的方法来解决它之前处理。我会再说一遍:如果有人能够提出一个工作正则表达式来替换双引号内的任意数量的单引号,这肯定是更好的方法。

编辑:

如果确定,唯一有问题的领域是pd一个,你可以使用这些信息来简单地替换所有单引号在特定的领域。这会更安全。

3

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

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

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

+0

你能帮我把这些通过正则表达式去掉吗? – 2013-03-19 18:44:55

-1

使用单引号(' ')是坏事 - U最好使用双引号(" ")Literals
例如:

var str = '{ "foo": "bar" }'; 
var json = JSON.parse(str); 
json['foo'] 
+0

这不是“坏事”,它显然无效。 – Quentin 2013-03-19 15:13:16

+0

虽然我同意你的看法,但这并没有回答他的问题。 (他需要确保任何引号在编码时被转义)。 – Martijn 2013-03-19 15:14:08

1

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

An array is an ordered collection of values...

而且

A value can be a string in double quotes, or a number, or true or false or null, or an object or an array.

所以,必须用你的字符串在双引号而不是单引号。


编辑:

有效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" 
    ] 
}

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

+0

你能为我做这些吗? – 2013-03-19 18:50:34

+0

@尼克确定,看到我更新的答案。 – fardjad 2013-03-19 19:57:36

+0

我同意你的例子,但我的字符串包含''xyz''而不是''xyz“',那么在那种情况下如何解析呢? – 2013-03-20 05:09:43

1

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

使用诸如JSON Lint(可能会出现此错误)之类的工具来测试您的JSON时非常有用,当您手动制作它时。 (通常你应该使用经过充分测试的库函数来生成你的JSON)。

+0

是的,我意识到这一点,但这个数据是从服务器端, 所以现在如何解决,请建议我? – 2013-03-19 18:43:53