我试图从url中获取JSON,但是在响应对象中,重复的键被删除了。有没有办法在不删除重复密钥的情况下完全获取它?这是我的js代码
$('document').ready(function(){
var s = $.getJSON("new.json");
console.log(s);
});
以下是我的new.json
{
"s": "wae",
"s": "asd"
}
但在控制台中,我获得的json对象如下
responseJSON: Object
s: "asd"
提前感谢
发布于 2015-06-15 12:47:08
如果您不能更改服务器响应,那么对于简单的JSON数据,您可以像请求文本一样请求json,并像字符串一样解析它:
var check = new RegExp('["\']([^\'"]*)[\'"][^:]*:[^"\']*["\']([^\'"]*)[\'"]',"g");
$.ajax({
url : "text.json",
dataType : "text",
success : function(data){
var newData = {};
data.replace(check,function(a,b,c){
if(typeof newData[b] == "undefined"){
newData[b] = c;
}else if(typeof newData[b] == "object"){
newData[b].push(c);
}else{
var ca = newData[b];
newData[b] = [ca,c];
}
return a;
});
console.log(newData);
console.log($.parseJSON(data));
},
error : function(e,a){
console.log(e,a);
}
});
在这段代码中,你的json的newData
是:
{"s": ["wae","asd"]}
发布于 2015-06-15 10:26:11
JSON对象中的键应该是唯一的。否则,具有该值的最后一个密钥通常是请求该密钥时显示的密钥。具有相同的键也会使区分对象的属性变得更加困难。密钥的全部意义在于使其可访问和可用。
要解决这个问题,你总是可以:
中的密钥
{"s": ["wae","asd"]}
对象中的名称应该是唯一的。
在这种情况下,必须按照RFC 2119中指定的方式来理解
这个词或形容词“推荐”意味着在特定情况下可能存在合理的理由来忽略特定的项目,但在选择不同的路线之前,必须理解并仔细权衡其全部含义。
RFC7159解释了为什么唯一键是好的:>名称都是唯一的对象在某种意义上是可互操作的>接收该对象的所有软件实现都将同意>名称-值映射。当对象中的名称不唯一时,接收此类对象的软件的行为是>不可预测的。许多实现只报告姓氏/值对>。其他实现报告错误或无法解析>对象,一些实现报告所有名称/值对,>包括重复项。>> JSON解析库的不同之处在于它们是否使对象成员的顺序对调用>软件可见。行为不依赖于成员>排序的实现将是可互操作的,因为它们不会受到这些差异的影响。
发布于 2017-07-06 17:12:24
对于JSON.parse()
,这是不可能的。我相信在更现代的ES规范中,后续键会覆盖之前的键。
但是,JSON规范并不禁止这样的JSON。还有其他的解析器和序列化程序可以在JavaScript中生成和使用这样的JSON。例如,您可以使用SAX风格的JSON解析器clarinet
const clarinet = require('clarinet');
const parser = clarinet.parser();
const result = [];
parser.onkey = parser.onopenobject = k => {
result.push({key: k, value: null});
};
parser.onvalue = v => {
result[result.length - 1].value = v;
};
parser.write('{"a": "1", "a": "2"}').close();
console.log(result);
// [ { key: 'a', value: '1' }, { key: 'a', value: '2' } ]
如果您想知道如何在浏览器中使用require()
,请学习如何使用webpack。
https://stackoverflow.com/questions/30842675
复制相似问题