2016-07-26 6 views
2

私は有効なJSON文字列を解析する方法を知っています:JSON.parse('{"key" : "value"}')JS:文字列をJS Object(** NOT ** ** JSON)に変換する方法は?

しかし、有効なJSオブジェクトはですが、無効なJSONはどうですか:JSON.parse("{ key : 'value'}")? 上記の例では、スロー:

Uncaught SyntaxError: Unexpected token k in JSON at position 2

私の実際の目的はさらに複雑です。私はJSオブジェクトの文字列を解析したいJSオブジェクトに(JSONによってサポートされていないが、JSでサポートされている)正規表現を含む

'{ key1 : /val1/g , key2 : /val2/i }' 

私は最終的にマングースと、このオブジェクトを使用して、それを使用してドキュメントを検索します:

Model.find({ 
    key1 : /val1/g , 
    key2 : /val2/i 
}) 

私はnew RegEx("val1","i")/val1/gを交換し、私のStringにかなり複雑な正規表現を適用しようとしている:

str = str.replace(/\/(.+?)\/(g?i?).+?(?=,|})/g , "new RegExp(`$1`,`$2`)") 

.replace()操作は機能し、私が望むように文字列を変更します。

{ key1 : new RegExp("val1","g") , key2 : new RegExp("val2","i") } 

をしかし、私はそれにJSON.parseを適用しようとすると、new RegEx("val1","i")が有効な値ではありませんので、それはまだ失敗:それは得られます。

+4

私はこれを言って自分自身が嫌いですが、おそらく 'eval'はあなたが探しているものですか? –

+0

ありがとう、それは確かに、私はそれについて考えなかった。 Evalがあまりにも強力です:) –

答えて

9

あなたがevalを使用することができ、制御し、あなたが変換しているテキストを信頼することができます場合:

var str = '{ key1 : /val1/g , key2 : /val2/i }'; 
 
var obj = eval("(" + str + ")"); 
 
console.log(obj.key1);

evalを行うことに注意してください、あなたの表現が始まるので、 {とすると、()にラップする必要があります。そのため、パーサーはブロックではなくオブジェクトイニシャライザを開始していることを認識します。

evalについてのメモのカップル:

  1. それは、任意のコードの実行を可能にします。あなたは本当にあなたがevalですテキストを信頼する必要があります。 evalユーザー入力をしないでください。

  2. evalへの呼び出しを直接含む実行コンテキストのコードは、基本的には最適化できません。JavaScriptエンジンはコードの解析時に文字列に含まれる内容を認識できないためです。技術的には時期尚早の最適化だと思いますが、メインロジックから直接呼び出すのではなく、メインロジックから直接呼び出して呼び出す関数で上記を止めたいと思います。

+1

それは大きな "if" ;-) –

+0

また、私はそれがJITの最適化を妨げると思います。 –

+1

@ JoachimSauer:ええ、私はそれをかなり大きくマークしようとしました。 :-)質問によれば、それはここにあるかもしれません。 –