1

「タグ付き」の値を持つjsonデータがあります(jsonpソースから):

{"foo": "@duration:8542"}

JSON.parse の 2 番目の引数として関数を渡すことで、オンザフライで解析できます。

dk.json = {
    parse: function (s) {
        return JSON.parse(s, function (key, val) {
            if (typeof val === 'string' && val[0] === '@') {
                var colonpos = val.indexOf(':');
                if (colonpos > 1) {
                    var tag = val.slice(0, colonpos + 1);
                    switch (tag) {
                        case dk.Date.tag:       return dk.Date.create(val);
                        case dk.Duration.tag:   return dk.Duration.create(val);
                    }
                }
            }
            return val;
        });
    },
    //...
};

しかし、この解析関数を にどのようにプラグインできjQuery.ajax()ますか? 以下よりも賢明なもの:

success: function (data) {
    data = dk.json.parse(JSON.stringify(data));
    ...

dataFilter、そして特にconverters有望に見えました:

$.ajax({
    dataType: 'jsonp',
    converters: {
        'text json': dk.json.parse
    },
    // ...
});

しかし、それはまったく呼び出されません (dataFilter は呼び出されますが、data パラメーターは undefined に設定されています)。

どこが間違っていますか?

[編集:]

jQuery によって返された JSON オブジェクトをたどるトラバーサル関数を記述できることはわかっています。たとえば、次のようになります。

function untag(val) {
    if (typeof val === 'string' && val[0] === '@') {
        var colonpos = val.indexOf(':');
        if (colonpos > 1) {
            var tag = val.slice(0, colonpos + 1);
            switch (tag) {
                case dk.Date.tag:     return dk.Date.create(val);
                case dk.Duration.tag: return dk.Duration.create(val);
            }
        }
    }
    return val;
}

var untag_json = function (jsonobj) {
    var _traverse = function _traverse(obj, result) {
        var value;
        for (var attr in obj) {
            value = obj[attr];
            if (value && typeof value === 'object') {
                result[attr] = _traverse(value, {});
            } else {
                result[attr] = untag(value);
            }
        }
        return result;
    };

    return _traverse(jsonobj, {});
};

success次に、ハンドラーで呼び出します。

success: function (data) {
    data = untag_json(data);
    ...

しかし、それは多くの不必要な作業のように思えます..convertersパラメータを使用$.ajaxして、解析されていない (つまり、テキストの) json ソースにアクセスする方法はありませんか?

4

2 に答える 2

0

こんにちは、サーバー側からの応答でこのヘッダー application/json を設定する必要があります。次に、dataType:json または dataType:jsonp を設定するだけで、json を文字列化または解析する必要はありません。次に、json からオブジェクト、プロパティ、または配列を取得します。

例:phpで使用します

$json_string = "{"foo": "@duration:8542"}";
$json = json_decode($json_string); 
$foo = $json->foo;
echo $foo;//prints @duration:8542

jqueryでは、これを行うことができます:

sucess:function(response) {
  var foo = response.foo;
  console.log(foo);
}

お役に立てれば

于 2013-11-10T22:10:25.207 に答える