ホームページ  >  記事  >  ウェブフロントエンド  >  XENON は JSON バリアント_json に基づいています

XENON は JSON バリアント_json に基づいています

WBOY
WBOYオリジナル
2016-05-16 18:22:24982ブラウズ

しかし、JSON を使用する過程で、誰もが遭遇するであろう問題に遭遇しました。それは、JSON では日時の送信方法が定義されていないということです。
json2.js は今年 3 月のアップデートで Date 関数と ISO-8601 日付/時刻形式のサポートを追加しましたが、一般的に使用されるさまざまな開発ツールでの日付のサポートは依然として多様であり、統一性がありません。全然。
さらに、日付/時刻に加えて、JSON でサポートされていない一部のクラスや関数のサポートも必要になる場合があります。

これを見て、JSON がサポートされていないのであれば、他のデータ記述/送信方法を使用すればよいのではないかと疑問に思う人もいるかもしれません。
その理由は、JSON 自体が JavaScript の機能的なサブセット (その参照標準は ECMAScript) であり、JavaScript の知識があれば誰でも簡単に JSON を利用できるためです。

JSON を解析する最も簡単な方法は、eval 関数を直接使用して JavaScript コードとして実行することです。JSON はインターネット上の異なるアプリケーション間で受け渡すためによく使用されるため、受信した JSON コンテンツを直接渡します。この関数は非常に危険であるため、JSON の形式は RFC 文書で厳密に指定されており、そのセキュリティをテストする方法が示されています。
このチェック方法では、関数の実行が禁止されています。

要するに、JSON は「たまに」使いにくいので、JSON を拡張するために頭を使い始めました。


RFC-4627、json2.js、およびいくつかの一般的な JavaScript 構文シェーダーを参照した結果、json2.js はすでに日付/時刻をサポートしていますが、文法分析モデルを使用していることがわかりました。文法解析をある程度理解していないと、それを拡張するのは難しいし、たとえ文法解析の知識が少しあっても、それを拡張するのは簡単ではありません。
そこで、RFC-4627 で推奨されている、より単純な正規表現フィルタリング方法を使用することにしました。

この拡張機能の基本的な実装は次のとおりです:

コードをコピーします コードは次のとおりです:

function Xenon(){}
var protoXenon = Xenon.prototype;
protoXenon.xeval = function(s){
var al = [], vl = [], ol = {};
function $(i, v){
// i = parseInt(i);// ol[i] || (ol[i] = v); 🎜>return ol.propertyIsEnumerable(i) ? ol[i] : (ol[i] = v);
for(var n)
if(this.propertyIsEnumerable(n) && typeof this[n] == 'function')
al.push(n), vl.push(this[n])
return eval('0,function(' al '){return ' s ';}') .apply(this, vl);
protoXenon.safeXeval = function(s){
var T = this; {}[]0 -9.- Eaeflnr-u nrt]/.test(
s.replace(/"(\.|[^"\])*"/g, '')
.replace (/([^ s:[,(] ?)(/g,function($0, $1){
// return T.propertyIsEnumerable($1) ? '' : $1 '(';
return T .propertyIsEnumerable($1) '' : '@';
})) &&


;使用方法は、 xenon オブジェクトを作成し、それに新しいメンバーを設定して拡張関数を有効にすることです。
拡張関数を xenon オブジェクトに直接追加することも、グローバル スコープで関数を宣言して非xenon オブジェクトの関数型メンバー値 >例:



コードをコピー


コードは次のとおりです:

注: この例は、JScript.NET コードとして直接実行することはできません。JScript.NET で使用する場合は、文字列「unsafe」を 2 番目のパラメーターとして eval 関数に渡す必要があります。
注 2: function キーワードの前に「0」を追加するのは、IE で使用される JScript エンジンとの互換性のためです。現在の非 CLI バージョンの JScript エンジンは、eval 実装で周囲の関数定義を正しく理解できません。括弧を使用すると構文エラーが発生します。
この例では 3 つの関数拡張が使用されています: Array はグローバル スコープの組み込み JavaScript 関数です; $ は、複数の場所で同じオブジェクトを参照できる組み込み関数です。ペア Date コンストラクターのラッパー。
XENON の実装では、新しいオブジェクトを作成するために new 演算子をサポートできませんでした。拡張関数を直接使用する代わりに new を使用する理由が見つかりませんでした。

名前について: 当初は xJson にしようと思ったのですが、ちょっと見劣りするなと思ったので XEON (eXtensible ECMAScript Object Notation) に変更しました。 Intel の登録商標なので、真ん中に N を追加して、XENON (eXtensible Native ECMAScript Object Notation) になりました。辞書で調べたら元素の名前だったのでそのまま使いました。
セキュリティについて: 検証方法を設計する過程で、インジェクションの問題を回避するために、できる限り多くの文字の組み合わせをテストしました。ただし、実技試験が少なく、文法解析などが苦手なため、絶対に安全というわけではないかもしれません。誰かがセキュリティホールを見つけた場合は、改善できるよう私に知らせてください。
将来時間があれば、ECMAScript オブジェクトを XENON に変換する簡単な関数を作成します。本当に十分な時間があれば、クラス名とコンストラクターを含む変換プロセスも実装するかもしれません。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。