我如何解析jsonp到javascript对象?

时间:2014-05-06 19:29:02

标签: jquery ajax parsing jsonp

我正在使用一个返回jsonp字符串的跨域api。我想将它解析为一个javascript对象,以便更容易使用。 我知道使用json字符串你可以这样做:

  success: function (val) {
                    var result = JSON.parse(val);
                }

但是,如果我使用从api获得的jsonp,我会得到“Uncaught SyntaxError:Unexpected token o”

我做错了还是这不是用jsonp做的方法?

--------编辑1 --------------------------- 如果我打开它,这就是我的jsonp字符串:

Object {resource: "boxscore", parameters: Object, resultSets: Array[22]}
parameters: Object
resource: "boxscore"
resultSets: Array[22]
0: Object
1: Object
2: Object
3: Object
4: Object
 headers: Array[28]
    0: "GAME_ID"
    1: "TEAM_ID"
    2: "TEAM_ABBREVIATION"
    3: "TEAM_CITY"
    4: "PLAYER_ID"
    5: "PLAYER_NAME"
    6: "START_POSITION"
    7: "COMMENT"
length: 28
__proto__: Array[0]
name: "PlayerStats"
rowSet: Array[26]
    0: Array[28]
        0: "0041300201"
        1: 1610612764
        2: "WAS"
        3: "Washington"
        4: 2772
        5: "Trevor Ariza"
        6: "F"
        7: ""
        8: "37:20"
        9: 7
        10: 10
        11: 0.7
        12: 6
1: Array[28]
2: Array[28]
3: Array[28]
4: Array[28]
5: Array[28]
6: Array[28]

所以我想要做的是用每个数组中的header-info解析数据,我该怎么做? 因此,例如,如果我想要GAME_ID,我只需编写GAME_ID,并为每个数组获得游戏代码“0041300201”。

4 个答案:

答案 0 :(得分:1)

你可以使用jsonp库..,如果跨域网站给json刺痛会很好:

go to this link it may be helpful.

http://www.jquery4u.com/function-demos/jsonp/

or you can use the code like


    /* Loading JSON objects using JSONP */
    (function($) {
        var url = 'http://www.jquery4u.com/scripts/jquery4u.settings.json';
        $.ajax({
           type: 'GET',
            url: url,
            async: false,
            contentType: "application/json",
            dataType: 'jsonp'
        });
    })(jQuery);

答案 1 :(得分:1)

如果您要进行成功回调并且这是一个jsonp调用,则您的val参数已经是一个javascript对象。

success: function (result) {
    console.log(result);
    console.log(result.someproperty);
}
如果result是对象,

这也解释了您的错误,因为JSON.parse({})会抛出相同的错误。

SyntaxError: Unexpected token o

相当于

JSON.parse("[object Object]"); // now you see where `o` came frome

答案 2 :(得分:1)

如果您正在访问支持JSONP并且可以使用jQuery的远程API,则可以轻松跳过中间解析步骤:

// Assuming you have jQuery available:
$.ajax('http://example.com/jsonpapi?callback=?', {
  dataType: 'jsonp',
  success: function(data) {
    // No parsing necessary.
    console.log(data);
  }
});

注入一个指向JSONP端点的脚本元素,端点通过在调用jQuery自动为您定义的函数中包装JSON来响应。 callback是JSONP回调的相对标准命名约定,但请仔细检查您的API预期。

如果你没有jQuery可用或者不想使用它,你可以定义一个回调函数并自己注入一个脚本元素:

var jsonpCallback = function(data) {
  console.log(data);
};

var s = document.createElement('script');

s.src = 'http://example.com/jsonpapi?callback=jsonpCallback';

document.getElementsByTagName('head')[0].appendChild(s);

这基本上就是jQuery在JSONP场景中为你做的。

答案 3 :(得分:-2)

这可能会解决您的问题:

function jsonp(data) {
  alert('jsonp was called');
}

$.ajax({
  url: 'http://jsfiddle.net/echo/jsonp/?callback=jsonp',
  dataType: 'jsonp',
  data: {
    'foo': 'bar'
  },
  success: function(data) {
    console.log(data);
  }
});

实际上,JSONP根本不是JSON,它只是JavaScript代码。在这种情况下没有理由进行评估......你可以在全局定义该函数之后完成。如果必须使用jQuery来执行

,jquery还提供了使用特定jsonp回调来创建同域jsonp请求的方法
// Create the function the JSON data will be passed to.
function myfunc(json) {
  alert(json);
}

$.ajax({
  type: "GET",
  url: "http://example.com?keyword=r&callback=jsonp",
  dataType: 'jsonp',
  jsonpCallback: 'myfunc', // the function to call
  jsonp: 'callback', // name of the var specifying the callback in the request
  error: function (xhr, errorType, exception) {
    var errorMessage = exception || xhr.statusText;
    alert("Excep:: " + exception + "Status:: " + xhr.statusText);
  }
});