在 jQuery 调用中编码 json

encoding json in jQuery call

本文关键字:编码 json 调用 jQuery      更新时间:2023-09-26

>我有一个这样的json:

{
"One'-test": {
            "name" : "One'-test",
            "link" : "xxx"              
        },
"Two'-test": {
            "name" : "Two'-test",
            "link" : "yyy"              
        }
}

在我的javascript文件中,我使用jQuery调用

var myJson;
jQuery.getJSON('path/myJson.json', function (data) {
     myJson = data;
    });

不幸的是,调用没有成功,从某种意义上说,myJson = data没有执行(我试图在语句之前放置一个控制台消息,但没有执行),变量myJson仍然未定义(我等待调用结束与$.when语句并打印出myJson)。问题很可能是名称One'-testTwo'-test的格式(字符"''"和"-"),因为路径是正确的(我很确定)。我不能改变这些名字,那么我必须考虑别的事情。知道吗?我尝试使用这样的 ajax 调用:

function getJson(myJson){
  $.ajax({
        type: "GET",
        url: "path/myJson.json",
        data: {},
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success:
          function(data) {
                 myJson = data;                
                     }
             });
         }      

但结果还是一样。

编辑

如果我尝试使用以下命令执行相同的代码:

  {
    "Onetest": {
                "name" : "One'-test",
                "link" : "xxx"              
            },
    "Twotest": {
                "name" : "Two'-test",
                "link" : "yyy"              
            }
    }

它成功了。这是"糟糕格式"的又一证明

如果我尝试使用以下命令执行相同的代码:

它成功了。这是"糟糕格式"的又一证明

好的,这告诉我们正在使用的 JSON 解析器将这些"One'-test"字符串解释为无效。你可以这样读 http://json.org(似乎 http://jsonlint.com 的人这样做,因为它也拒绝这些字符串),尽管RFC说

任何字符都可以转义。

。它认为,虽然毫无意义,但-之前的'不应该是一个错误。但也许 RFC 意味着任何字符都可以作为 Unicode 转义或类似内容进行转义。

最好的

事情是你说你不能做的事情:修复 JSON,-之前删除最好的不必要最坏问题'

下一个最好的办法是做一些预处理。你可以通过告诉jQuery不要尝试解析JSON来进行直接的字符串替换:

$.ajax({
    type: "GET",
    url: "path/myJson.json",
    data: {},
    dataType: "text",        // <=== Don't parse it
    success: function(data) {
        // ...
    }
});

然后在success做:

myJson = JSON.parse(data.replace(/''-/g, "-"));

。当然,这是一个相当幼稚的替代品。

这是第二位的演示:

var data =
  '{' +
  '"One'-test": {' +
  '            "name" : "One'-test",' +
  '            "link" : "xxx"          ' +    
  '        },' +
  '"Two'-test": {' +
  '            "name" : "Two'-test",' +
  '            "link" : "yyy"          ' +    
  '        }' +
  '}';
var myJson = JSON.parse(data.replace(/''-/g, "-"));
snippet.log(myJson["One-test"].name); // "One-test"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>