1

我有带有“标记”值的 json 数据(来自jsonp来源):

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

我可以通过将函数作为第二个参数传递给 JSON.parse 来即时解析:

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被调用,但数据参数设置为未定义)。

我哪里错了?

[编辑:]

我知道我可以编写一个遍历 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

1

在 JSONP 请求 ( src )中实际上没有任何 JSON 解析,这似乎违反直觉。正在发生的事情是从 JSONP 端点返回的字符串被评估为 JavaScript(引用在 DOM 中定义(或动态添加)的函数,使 JSONP 请求如下所示:

_callback({'foo':'@duration:8524'});

如果你想使用你的函数,你需要让端点返回一个这样的字符串:

_callback("{'foo':'@duration:8524'}");

然后在 JSONP 回调中你可以调用JSON.parse(). JSON 解析是一种处理 JSON 的相当安全的方法,所以如果这更容易推理,那么这将是一个很好的方法。

于 2013-11-12T22:08:43.487 回答
0

您好,您需要在服务器端的响应中设置此标头应用程序/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 回答