代码之家  ›  专栏  ›  技术社区  ›  A. Levy

使用XMLHttpRequest加载JSON文件时Firefox中出现“格式不正确”错误

  •  65
  • A. Levy  · 技术社区  · 17 年前

    当我页面上的JavaScript加载一个包含JavaScript对象符号格式对象的文本文件时,Firefox 3.0.7的错误控制台中出现了一个“格式不正确”的错误。如果文件只包含JSON对象,则会产生错误。如果我将对象包装在<文件></文件>标记它不会产生错误。无论哪种方式,请求都会成功,因此我可以忽略它,但我不希望错误日志中充满这些消息。

    { a: 3 }
    

    现在,需要一些代码来加载该文件:

    var req = new XMLHttpRequest();
    req.open("GET", "data.json");
    req.send(null);
    

    这会在Firefox错误控制台中产生以下错误:



    {a:3}

    <document>{ a: 3 }</document>
    

    没有错误。我认为它在抱怨,因为纯JSON文件不是格式良好的XML文档,所以我尝试在“send”调用之前重写MIME类型,强制将其作为纯文本加载,但没有成功。

    var req = new XMLHttpRequest();
    req.open("GET", "data.json");
    req.overrideMimeType("text/plain");
    req.send(null);
    // Still produces an error!
    

    我将继续将JSON数据包装到XML文档中,以绕过XMLHttpRequest正在执行的任何验证,但我想知道是否有任何方法可以强制它不加批判地加载纯文本,而不尝试验证它。或者,除了XMLHttpRequest之外,还有其他加载数据的方法可以与纯文本一起使用吗?

    8 回复  |  直到 17 年前
        1
  •  76
  •   jthompson    17 年前

    您是否尝试过将MIME类型用于JSON?

    application/json
    

    您还可以将服务器配置为自动为.json文件发送此MIME类型。

        2
  •  21
  •   Kent Fredric    17 年前

     { "a": 3 } 
    

    另外,当您使用裸XMLHttpRequest时,除非MIME头严格指定其他内容,否则它通常希望收到XML结果。

    不过,您可能希望通过简单地使用jQuery之类的JavaScript框架来简化自己的生活,它将为您解决所有这些问题,并处理所有令人讨厌的边缘情况。

    $.getJSON("data.json",{}, function( data ){ 
      /*  # do stuff here  */ 
    });
    

        3
  •  7
  •   Dustin Oprea    15 年前

    当内容类型完全为空时也会发生这种情况(从而避免了自然类型检测)。

        4
  •  4
  •   Julian Aubourg    17 年前

    实际上应该是{“a”:3}。

        5
  •  4
  •   prototype    14 年前

        6
  •  0
  •   focorner    10 年前

    我也收到了同样的警告信息 XMLHttpRequest() Content-Type: application/json 通过服务器。

    XMLHttpRequest.responseType 财产 json 在请求对象上。例如,

    var request = new XMLHttpRequest();
    request.onreadystatechange = function() { ... }
    ...
    request.open('GET','https://random-domain.com/random-path',true);
    request.responseType = 'json';
    ...
    request.send();
    
        7
  •  0
  •   Christophe Roussy    8 年前
    Browser --- request expects a given content-type ---> Server
            <-- response contains content-type ----------
    

    Content-Type header .

        8
  •  0
  •   halfer Jatin Pandey    4 年前

    除非有特定的原因直接从磁盘打开HTML( file:// http:// the prototype user has written . 这将解决此问题,因为 MIME type will be set correctly, as jthompson suggested .

    因此,您也不会遇到其他问题,例如“ Reason: CORS request not HTTP “,也可能是其他浏览器在被要求打开本地磁盘上的文件时越来越可疑,这是出于良好的理由(安全!)。


    如果您的系统上有Python,那么 the (arguably) easiest way to run a local HTTP server

    python3 -m http.server

    窗户: python -m http.server 或 py -3 -m http.server

        9
  •  -6
  •   Brian Mains    13 年前

    肯特,我不同意。

    以下 是 “有效”JSON:

    { a: 3 }
    

    JavaScript对象属性名称不必是字符串。

    我刚刚解决了这个问题,将json作为“text/javascript”添加到我的Web服务器mime类型文件中:

    text/javascript                 js, json
    

    推荐文章