Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为jQuery.ajax使用不同的json解析器?_Javascript_Jquery_Ajax_Json - Fatal编程技术网

Javascript 如何为jQuery.ajax使用不同的json解析器?

Javascript 如何为jQuery.ajax使用不同的json解析器?,javascript,jquery,ajax,json,Javascript,Jquery,Ajax,Json,我有带有“标记”值的json数据(来自jsonpsource): 我可以通过将函数作为第二个参数传递给JSON.parse来动态解析: dk.json = { parse: function (s) { return JSON.parse(s, function (key, val) { if (typeof val === 'string' && val[0] === '@') { var colo

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

我可以通过将函数作为第二个参数传递给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));
    ...
数据过滤器
,尤其是
转换器
看起来很有前景:

$.ajax({
    dataType: 'jsonp',
    converters: {
        'text json': dk.json.parse
    },
    // ...
});
但根本不会调用它(调用dataFilter,但将数据参数设置为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);
    ...

但那似乎是很多不必要的工作。。是否无法使用
converts
参数
$.ajax
访问未解析(即文本)的json源?

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

希望这对您有所帮助。

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

希望这能有所帮助

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

_callback({'foo':'@duration:8524'});
_callback("{'foo':'@duration:8524'}");
如果要使用函数,需要使端点返回如下字符串:

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

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

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

_callback({'foo':'@duration:8524'});
_callback("{'foo':'@duration:8524'}");
如果要使用函数,需要使端点返回如下字符串:

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

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

我想您误解了……我希望解析后的JSON是一个类似于
{foo:dk.Duration.create('@Duration:8524')的对象
即在json解析期间,'@duration:8524'字符串应转换为dk.duration对象。您的jQuery函数仅打印出字符串“@duration:8542”,它不是
dk.duration
isinstance
…如果将此值传递给
dk.duration.create()
我猜它可能会从该值创建该实例。当然,是的,但关键是在解析json字符串的过程中自动执行该操作。这就是json.parse的第二个参数(
reviver
参数)是for。请参见例如:既然我可以使用本机JSON.parse调用来完成它…那么在使用
jQuery.ajax(…)
时,我可以做什么?您的JSON格式将是什么?如果您有如下对象数组:
{“数据”:[{'foo':'@duration:8524'},{'tag somvaluelikeother'}
,那么您可以使用jQuery
success:function(response)解析它{$.each(response.data,function(key,value){switch(value){case dk.Date.tag:return dk.Date.create(value);break;case dk.Duration.tag:return dk.Duration.create(value);break;}}}}
我想你误解了……我希望解析后的json是一个类似于
{foo:dk.Duration.create.create的对象('@duration:8524')}
即'@duration:8524'字符串应在json解析期间转换为dk.duration对象。jQuery函数仅打印出字符串“@duration:8542”,它不是
dk.duration
isinstance
…如果将此值传递给
dk.duration.create(),会发生什么情况
我猜它可能会从该值创建该实例。当然,是的,但关键是在解析json字符串的过程中自动执行该操作。这就是json.parse的第二个参数(
reviver
参数)是for。请参见例如:既然我可以使用本机JSON.parse调用来完成它…那么在使用
jQuery.ajax(…)
时,我可以做什么?您的JSON格式将是什么?如果您有如下对象数组:
{“数据”:[{'foo':'@duration:8524'},{'tag somvaluelikeother'}
,那么您可以使用jQuery
success:function(response)解析它{$.each(response.data,function(key,value){switch(value){case dk.Date.tag:return dk.Date.create(value);break;case dk.Duration.tag:return dk.Duration.create(value);break;}}}}
你是天才:-)单引号不是有效的json,所以我最终返回(python):
回调+(dk.json.parse(%s))“%json.dumps(json.dumps(value))
。第一个
回调
是从jQuery收到的
success
函数,嵌套的
json.dumps()
调用首先将
转换为json,然后将json转换为字符串(不是真的,但我想你知道我的意思)你是个天才:-)单引号不是有效的json,因此我最终返回(python):
callback+“(dk.json.parse(%s))%json.dumps(json.dumps(value))