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

フィールドの 1 つに一重引用符が含まれています。

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) すべての可能性を捉えることは実際には不可能だと思い始めています。

これについて間違っている場合は、誰かが私を訂正してくれることを願っています。とにかく、これが実際に当てはまる場合、最も簡単な方法は最も落胆する方法だと思いますeval()。それは有効な JSON ではないかもしれませんが、(驚くべきことに) 正しい JS オブジェクト定義です。

eval("var data = " + str);

JSON 文字列が必要な場合は、次を使用できますstringify()

var json = JSON.stringify(data);

ここに実用的なフィドルがあります。

前もって言わなければならないのは、提案eval()はこの Web サイトではひどい動きであり、当然のことです。ただし、反対票を投じる前に、サーバーからの異常なデータ形式があり、処理前に修正する簡単な方法がないことを考慮してください。もう一度言いますが、二重引用符内の任意の数の単一引用符を置き換えるための有効な正規表現を誰かが思いつくことができれば、それは確かにはるかに優れた方法になるでしょう.

編集:

問題のあるフィールドが 1 つだけであることが確実な場合は、pdその情報を使用して、その特定のフィールド内のすべての一重引用符を単純に置き換えることができます。その方がはるかに安全です。

于 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が必要かどうかわかりません。その場合は、これらの値に s をpd追加してください。\"

于 2013-03-19T15:12:29.593 に答える
1

JSON 文字列は二重引用符で区切られます"。JavaScript リテラルでは有効ですが、JSON では無効な一重引用符を使用しています。

JSON lintなどのツールを使用して(このエラーを検出します)、JSON を手動で作成するときにテストすると便利です。(通常、十分にテストされたライブラリ関数を使用して 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 に答える