我试图使用JSON.parse解析这个字符串。
Ex.
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之类的方法,这样我就可以解析该字符串了吗?
发布于 2013-03-20 11:25:23
好的,重点是:如果这是来自服务器的数据,那是一种糟糕的数据格式。它不是有效的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);这是一把有用的小提琴。
我必须提前说一句:建议eval()在这个网站上是个糟糕的举动,这是正确的。但是在否决投票之前,请考虑我们有来自服务器的病理数据格式,并且在处理之前没有简单的方法来修复它。我要再说一遍:如果有人能想出一个有效的正则表达式来替换双引号中任意数量的单引号,那肯定是一个更好的方法。
编辑:
如果您确信唯一有问题的字段是pd字段,您可以使用该信息简单地替换该特定字段中的所有单引号。那就安全多了。
发布于 2013-03-19 15:04:47
您的一个字段中有单引号:
9911143976001||18373205-L-I-F-T- RACER WN'S, PINK, 5||11143976**strong text**试着移除它们,或者逃离它们。
发布于 2013-03-19 15:12:29
根据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:我不确定在"数组的第一个和最后一个元素中是否应该有pd。如果是这样,只需将\"s添加到这些值中。
https://stackoverflow.com/questions/15502969
复制相似问题