1

私が持っているとしましょう:

<cfscript>
arrButtons = [
    {
        "name" = "Add",
        "bclass" = "add",
        "onpress" = "addItem"
    },
    {
        "name" = "Edit",
        "bclass" = "edit",
        "onpress" = "editItem"
    },
    {
        "name" = "Delete",
        "bclass" = "delete",
        "onpress" = "deleteItem"
    }
];

jsButtons = SerializeJSON(arrButtons);
// result :
// [{"onpress":"addItem","name":"Add","bclass":"add"},{"onpress":"editItem","name":"Edit","bclass":"edit"},{"onpress":"deleteItem","name":"Delete","bclass":"delete"}]
</cfscript>

すべてのonpressアイテムについて、JSライブラリの要件に一致するように、値から二重引用符を削除する必要があります(onpressの値はコールバック関数である必要があります)。

正規表現を使用して二重引用符を削除するにはどうすればよいですか?

最終結果は次のようになります。

[{"onpress":addItem,"name":"Add","bclass":"add"},{"onpress":editItem,"name":"Edit","bclass":"edit"},{"onpress":deleteItem,"name":"Delete","bclass":"delete"}]

addItemeditItem、およびdeleteItemを囲む二重引用符はありません。

編集2012-07-13 なぜこれが必要なのですか?結果が多くのファイルで使用されるJSのコレクションになるCFML関数を作成しました。jsButtonオブジェクトは、JSライブラリで使用可能なオプションの一部として使用されます。その関数の引数の1つはstructの配列(デフォルトはarrButtons)であり、指定された引数値はデフォルト値とマージできます。

(CFMLでは)二重引用符なしでonpress値を書き込むことはできないため、その値に二重引用符を追加し、構造体の(CFML)配列をJSON(単なる文字列)に変換して二重引用符を削除する必要がありますJSライブラリオプションに配置する前に。

Railoを使用すると、構造体をリンクされた構造体として宣言して、ループまたは変換に同じ順序のキーがあることを確認できます(上記の例から、構造体の最新のキーを常に押してください)このリンクされた構造体と同じキー順序を使用すると、単純な置換関数で二重引用符を削除できますが、もちろん、CFML関数を使用するすべてのプログラマーが、上記の例と同じようにリンクされた構造体とキー順序を使用することを忘れないことを保証することはできません。

4

3 に答える 3

1

これが実際に必要かどうかはわかりません-JSコールバックを処理する方法/場所によっては、引用符を削除せずに文字列関数名を使用して関数を参照できる場合があります(つまりobject[button.onpress])。

しかし、あなたが尋ねたので、ここに正規表現の解決策があります:

jsButtons  = jsButtons.replaceAll('(?<="onpress":)"([^"]+)"','$1');


そこにある正規表現は、次の2つの部分で構成されています。

(?<="onpress":)-テキストを処理していることを確認するために後ろを振り返ります"onpress":
"([^"]+)" -引用符を一致させ、その内容をキャプチャします。

$1置換側では、一致したテキスト(つまり引用符で囲まれた値全体)を最初のキャプチャグループ(つまり引用符の内容)で置き換えます。

「onpress」の大文字と小文字の区別が問題になる可能性がある場合は、大文字と小文字(?i)を無視するように正規表現の前に付けることができます。

(「onpress」だけでなく)複数の異なるイベントが発生する場合は、上記の式の関連部分を更新して、(?<="on(?:press|hover|squeek)":)などにすることができます。


注:上記はすべて、フォーマット出力が変更されないことに依存していますserializeJson-コメント、空白、一重引用符、またはその他のものが将来存在する可能性がある場合は、それらに対応するために長い式が必要になります-これが理由の一部ですそもそもこの問題を解決するために正規表現が必要かどうかを調査する必要があります。

于 2012-07-12T15:40:34.550 に答える
1

出力したいのはJSONではないので、SerializeJSONを使用するのは簡単ではありません。

Javascriptを直接記述するのではなく、最初にColdFusion配列に配置する理由はありますか?

JSONは、純粋にデータ記述言語を意味します。http://www.json.org によると、これは「軽量のデータ交換形式」です-プログラミング言語ではありません。

http://en.wikipedia.org/wiki/JSONによると、サポートされている「基本タイプ」は次のとおりです

  • 数値(整数、実数、または浮動小数点)
  • 文字列(バックスラッシュをエスケープした二重引用符付きUnicode)
  • ブール値(trueおよびfalse)
  • 配列(値の順序付けられたシーケンス、コンマで区切られ、角括弧で囲まれています)
  • オブジェクト(キーと値のペアのコレクション、コンマで区切られ、中括弧で囲まれています)
  • null

-出典

于 2012-07-12T21:01:47.247 に答える
0

この場合、serialize()を使用するだけでよいと思います。それでうまくいくはずです...

ガート

于 2012-07-12T08:14:50.657 に答える