2013-03-19 157 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