【问题标题】:with jQuery, access json from cross domain url where json may be poorly formed使用 jQuery,从 json 格式可能不正确的跨域 url 访问 json
【发布时间】:2010-12-21 03:44:43
【问题描述】:

我正在使用 jQuery 的 ajax 函数来访问跨域 url。该网址将返回 json。我正处于发现阶段,但我认为,因为 json 值包含几个 '&quot' 字符串,所以 json eval 会引发错误并停止执行我的客户端脚本。我得到的错误是“未终止的字符串文字”。我知道,如果我通过将返回的 json 放在本地 div 中并删除“”来对返回的 json 进行硬编码并删除字符串(和几个隐藏的特殊字符),我可以让 json 成功评估。 无论是通过解决方法,还是通过更正我的代码,我可以做些什么来从 url 获取 json 并将其作为有效的 json 对象存储在我的客户端 javascript 中?

我当前的代码。没有任何定义的函数(成功、完成、错误、数据过滤器)执行:

$(function() {
  $.ajax({
  url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
  dataType: "jsonp",
  success: successFunc,
  complete: completeFunc,
  error: errorFunc,
  dataFilter: dataFilterFunc
});

});

function successFunc() { console.log('successFunc(). enter.'); }
function completeFunc() { console.log('complete(). enter.'); }
function errorFunc() { console.log('errorFunc(). enter.'); }
function dataFilterFunc(data, type) { 
  data.replace(/\W/g, ' ');
  return data; 
}

【问题讨论】:

    标签: javascript jquery json jsonp


    【解决方案1】:

    问题在于 JSONP 服务,它完全取消了 callback 参数。

    JSONPresponse 只是一个使用callback get 参数作为函数名的函数调用:

    如果你看一些 JSONP 服务的响应,应该是这样的:

    http://somesite.com/jsonp?callback=myCallback

    会返回:

    myCallback({/*json*/});
    

    虽然 you post 正在返回 plain valid JSON,但它不能作为 JSONP 响应处理。

    【讨论】:

      【解决方案2】:

      嗯。我不知道 jQuery,但我知道 JSON。 (我为它写了一个基于 C++ 的解析器。) 我去了你显示的网址:http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?。 Python 的 JSON 解析器接受这一点,我的经验是 Python 的 JSON 解析器是正确的。请注意:

      { "blah": "string " More more more" }
      

      ...是有效的 JSON。 " 部分在 JSON 中没有特殊解释 - 它们只是字符串中的字符。


      编辑:仔细研究一下,我发现非常有趣的是,无论生成什么都是转义一些正斜杠,但不是全部。 “开始”项是“/Date(-XXXXX)/”,即 JSON 中的文本 /Date(-XXXXX)/ - / 可以选择转义。但是,在键为“SpeakerURI”和“URI”的项目中,它们不会被转义。


      编辑:通过我的基于 C++ 的解析器运行它。最初它没有接受它,但这个 JSON 实际上暴露了我的解析器中的一个错误。

      【讨论】:

      【解决方案3】:

      您可以考虑尝试 jquery-jsponp 插件,它修复了 jQuery 的 jsonp 处理的一些问题。

      http://code.google.com/p/jquery-jsonp/

      我用过,有很多很好的例子。

      你真的需要让你的回调工作,这样你才能看到发生了什么。


      更新:我对 jsonp 进行了一次尝试,但遇到了意外的令牌错误。不知道为什么——我可以手动从 URL 中获取数据,将其分配给控制台中的 JavaScript 变量,就可以了。

      【讨论】:

      • 它是否说明了 JSON 的位置?如果你需要换行符,我在这里放一个:pastebin.com/m65681d28——这看起来像是 JSON 解析器中的一个错误。
      • 对不起。今晚没时间追查。也许明天。
      • 我还必须修改 pastbin.com/m65681d28 中的第 250 行才能解析 json。如果我没记错的话,我必须在“Level:”和“Duration:”之后替换“空格”。我明天去验证。
      【解决方案4】:

      在一小时内分析您的数据后,

      我发现了以下

      {
         "URI":"/rest/sessions/Maintainable-ASPNET-MVC",
         "Title":"Maintainable ASP.NET MVC",
         "Abstract":".....\u003e\u2028Duration: 60-90 minutes\u003cbr\u003e\u2028Subject Area: development....."
      }
      

      在 Duration 和 Subject Area 之前有 char \u2028,

      \u2028 是行分隔符,所以它的意思是,有点像\n,所以你在引号“”之间有换行符,这可能是根案例。

      如果您删除它,您将不会在 firebug 中看到 未终止的字符串文字

      为了测试,在地址栏中粘贴以下内容,Firefox 和 Opera 失败,而 IE8 和 Chrome 正在运行

      javascript:alert(eval('[{"Abstract":"\u003e
    Duration: 60-90 minutes\u003cbr\u003e
    Subject Area: development."}]'))
      

      已经有人写博客了

      http://bulknews.typepad.com/blog/2009/02/json-jquery-and-some-unicode-characters-u2028.html

      【讨论】:

      • 不——这是有效的 UTF-8:它是 U-2028,它是一个行分隔符。您的解码失败,因为您输入错误。它不影响 JSON 文本的有效性。
      • 你做了什么更新? JSON 字符串中存在 U+2028 是有效的 JSON。
      • JSON 文本中的偏移量 0x62E1 是您要查找的位置,对吗?
      • 不,真人角色就好了。请参阅 JSON RFC:ietf.org/rfc/rfc4627.txt - 特别注意:unescaped = %x20-21 / %x23-5B / %x5D-10FFFF - 由于 U+2028 在给定范围内,因此 JSON 解析器应接受直接编码的 U+2028,或转义为 \u2028。
      • 所有浏览器都有自己的实现,我添加了代码来测试,firefox和Opera失败,而IE8和Chrome工作
      【解决方案5】:

      我似乎没有更接近客户端解决方案。我将代码更改为使用 jQuery-jsonp。现在看起来像这样:

      $(function() {
        $.jsonp({
        url: "http://www.codemash.org/rest/sessions.json?format=jsonp&callback=?", 
        async: false,
        dataType: "jsonp",
        success: successFunc,
        complete: completeFunc,
        error: errorFunc,
        dataFilter: dataFilterFunc
      });
      
      });
      
      function successFunc(json, textStatus) { 
        console.log('successFunc(). enter.'); 
      }
      function completeFunc(xOptions, textStatus) { 
        console.log('complete(). textStatus: ['+textStatus + ']'); 
      }
      function errorFunc(xOptions, textStatus) { 
        console.log('errorFunc(). textStatus: [' + textStatus + ']'); 
      }
      function dataFilterFunc(j) { 
        console.log('dataFilterFunc(). enter.');
        return j; 
      }
      

      Firebug 的控制台日志显示:

      X unterminated string literal
      [{"URI"..... ( the json returned from the server
      errorFunc(). textStatus: [error]
      complete(). textStatus: [error]
      

      无论出于何种原因,我的 Firefox 浏览器(FF v3.0.15,Linux Ubuntu 9.0.4)中的 json 解析都会引发“未终止的字符串文字”异常。我知道如果我删除“可维护的 ASP.NET MVC”块中的“& q u o t”字符串和两个字符,那么 json 将成功解析。由于我无法控制服务器端,我可以用客户端 javascript 做些什么,最终将服务器的 json 字符串按原样放入客户端 json 对象中。我认为 jsonp 的 dataFilter 属性正是为此目的而设置的,以拦截 json 并“清理”它。但是,我的代码中的那个函数没有被调用,很可能是因为传入 dataFilterFunc 函数的 json 解析不成功。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 2020-11-04
        相关资源
        最近更新 更多