2011-01-24 20 views
0

私はprototypeJSフレームワークをアップグレードして以来、問題に追いついてきました。"変換された"オブジェクト文字列をJSONまたはObjectに変換する

JSON解析では、この文字列をオブジェクトに変換できなくなりました。

"{empty: false, ip: true}" 

は、以前のバージョン1.6でそれが可能だったと今では

'{"empty": false, "ip": true}' 

のような「検証」JSON文字列にする必要があるしかし、どのように私は戻って、オブジェクトへの第一の例を変換することができますか?

答えて

6

JSONが引用されるすべてのキーを必要とするので、この:

"{empty: false, ip: true}" 

は有効なJSONではありません。このJSONを解析できるようにするには、事前処理が必要です。

function preprocessJSON(str) { 

    return str.replace(/("(\\.|[^"])*"|'(\\.|[^'])*')|(\w+)\s*:/g, 
    function(all, string, strDouble, strSingle, jsonLabel) { 
     if (jsonLabel) { 
      return '"' + jsonLabel + '": '; 
     } 
     return all; 
    }); 

} 

(Try on JSFiddle)それは二重引用符で囲む引用符で囲まれたその言葉に、コロンの単語を、交換する単純な正規表現を使用しています。正規表現は他の文字列の中のラベルを引用しません。

次に、あなたが安全に

data = JSON.parse(preprocessJSON(json)); 
+0

その速い応答のためにありがとうが、私はSyntaxErrorを得る:終端のカッコいい、私はそれを理解できないだろうと私はregexpが何とかミスタイプされていると思います... – Maertz

+0

あなたは正しいです。私は正規表現を修正しました。私はどういうわけか、これを掲示する前に偶然閉会括弧を削除しました。それは修正されました。これを見つけていただきありがとうございます! – Thai

+0

うん、今、それは動作します、ありがとうたくさん - このソリューションは、評価接続より優れているかもしれません:) – Maertz

1

jsonパーサが無効なjsonであるため、最初の入力を受け付けなかったことは意味があります。最初の例で使用しているのはjavascriptのオブジェクト表記です。これをeval()関数を使ってオブジェクトに変換することは可能です。

var str = "({empty: false, ip: true})"; 
var obj = eval(str); 

実行するコードが保存されていることが保証されている場合にのみ、これを行う必要があります。 jsonの仕様hereの詳細については、こちらをご覧ください。 jsonバリデーターはhereです。

編集:上記のタイの答えは、おそらくより良い解決策である

+2

は、JavaScriptエンジンはオブジェクトではなく、ブロックとしてそれを見るようにするために括弧を追加する必要がありますすることができます。 'eval( '(' + str + ')')'となります。 – Thai

+0

ありがとう、それは私のために働く:) – Maertz

関連する問題