文字列を一重引用符でJSONとして解析しますか?


84

私はひもを持っています

str = "{'a':1}";
JSON.parse(str);
VM514:1 Uncaught SyntaxError: Unexpected token '(…)

上記の文字列(str)をJSONオブジェクトに解析するにはどうすればよいですか?

これは単純な構文解析のようです。しかし、それは機能していません。


7
一重引用符は正しくフォーマットされていないjsonであるため、そのようなものを受け取った場合は、解析を試みる前に、str.replace()を使用し、一重引用符を「」に置き換える必要があります
aup

1
とにかく、JavaScriptの文字列には常に一重引用符を使用するようにしてください。var str = "bad example";これは良い習慣ではありません。次のvar str = 'good example';ことをお勧めします。=>このようにすると、JSONで問題が発生することはなく、HTMLでも問題が発生することはありません。:)
ReeCube 2016年

3
@ReeCubeそれは意見に過ぎないようです-とにかくHTMLに問題はありません、それは両方を受け入れます。JSONの場合、なぜ文字列で作成するのですか?前回、オブジェクト以外のものからJSONを作成したときのことは覚えていません。
デイブニュートン

2
@DaveNewton定期的にノード、Python、phpからjson文字列を作成します。
alfadog 6719年

1
私はあなたの主張を理解していないと思います。しかし、大丈夫です。
alfadog 6719年

回答:


86

JSON標準二重引用符を必要とし、単一引用符を受け入れ、またパーサは行いません。

文字列にエスケープされた一重引用符がない単純なケースがある場合(通常は不可能ですが、これはJSONではありません)、単純にすることができ、str.replace(/'/g, '"')最終的に有効なJSONになるはずです。


5
あなたの答えはデータを改ざんします。良い答えは、データ構造内のデータではなく、構造を変更することです。
ティモシーゴンザレス

3
@ssube、一重引用符を二重引用符にグローバルに置き換えることは、辞書の値を破壊する可能性があるため、最初に頭に浮かぶ、滑り止めの方法です。たとえば、'title': "Mama's Friend"になり "title": "Mama"s Friend"ますが、もちろん無効です!私はあなたの返事に反対票を投じるべきですが、私は反対票を投じることに反対です。このコメントはもっと価値があります。
アポストロス

31

古い投稿だと思いますが、この目的でJSON5を使用できます。

<script src="json5.js"></script>
<script>JSON.stringify(JSON5.parse('{a:1}'))</script>

8
上記のソリューションは次のようなもので失敗するため、賛成票を投じました。 {'section': "24'"} これは: {"section": "24""} になり、解析されません。
snedkov 2018年

1
これが一番の答えになるはずです。
サムR.20年

完璧なソリューション。改行と空のスペースを含むhtmlのスクリプトタグからJSON文字列を取得しようとしていました。私の日を救った!
DriLLFreAK1 0020年

私にとって、これは働いていた<script>JSON.stringify(some_jsonString)</script>
jAntoni

12

JSONが(ユーザー入力ではなく)安全に制御できると確信している場合は、JSONを簡単に評価できます。Evalは、引用符で囲まれていないプロパティ名だけでなく、すべての引用符タイプを受け入れます。

var str = "{'a':1}";
var myObject = (0, eval)('(' + str + ')');

evalパーサーの動作方法により、追加の括弧が必要です。Evalは、管理しているデータで使用する場合は悪ではありません。)(JSON.parseとevalの違いの詳細についてを参照)(JSON.parse対のeval


2
あなたはevalはこの場合は悪ではないと思う場合でも、JSON.parseは常に高速です:jsperf.com/json-parse-vs-eval/3
アルカノイド

あなたはそれが唯一の有効なJSON(JSON.stringifyによる)を使用し、この場合には適用されないためにリンクされたベンチマーク@Arkanoid
syockit

7

このようなもの:

var div = document.getElementById("result");

var str = "{'a':1}";
  str = str.replace(/\'/g, '"');
  var parsed = JSON.parse(str);
  console.log(parsed);
  div.innerText = parsed.a;
<div id="result"></div>


7
var str =  "{'a':1}";
str = str.replace(/'/g, '"')
obj = JSON.parse(str);
console.log(obj);

これは私にとって問題を解決しました。


1
これにより、データも変更されます。{'a':"A'A"}なります{"a":"A"A"}
GodSaveTheDoge

6

JSONでは、キーに一重引用符を使用することはできません。二重引用符を使用する必要があります。

あなたのユースケースでは、おそらくこれが最も簡単な解決策でしょう:

str = '{"a":1}';

出典

プロパティに引用符が必要な場合は、二重引用符を使用する必要があります。すべてのプロパティ名は二重引用符で囲む必要があります。


-12
json = ( new Function("return " + jsonString) )(); 

あなたの答えを説明してください
スターリングアーチャー

3
みんな、これをしないでください。これは、超安全ではありません
jpumford

Functionevalの代わりに使用する原則は健全ですが、それ以外はすべて間違っています。あるべきですvar json = Function("'use strict';return " + jsonString)()
ジャックギフィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.