我使用JavaScript从API获取数据。
声明console.log(json[0])
给出了结果:
{"id":"1","username":"ghost","points":"5","kills":"18","xp":"10","diamonds":"0","level":"1","missionscomplete":"1"}
现在我正在尝试打印这本词典的各个元素。我该怎么做呢 ?我的代码如下:
function loadLeaderboard(){
$.get("http://localhost:8888/l4/public/api/v1/getLeaderboard",function(data){
var json = $.parseJSON(data);
console.log(json[0]);
$.each(json[i], function(key, data) {
console.log(key + ' -> ' + data);
});
});
}
修改: API返回的数据值为
["{\"id\":\"1\",\"username\":\"ghost\",\"points\":\"5\",\"kills\":\"18\",\"xp\":\"10\",\"diamonds\":\"0\",\"level\":\"1\",\"missionscomplete\":\"1\"}","{\"id\":\"2\",\"username\":\"seconduser\",\"points\":\"0\",\"kills\":\"3\",\"xp\":\"0\",\"diamonds\":\"0\",\"level\":\"0\",\"missionscomplete\":\"0\"}","{\"id\":\"3\",\"username\":\"goat\",\"points\":\"12\",\"kills\":\"13\",\"xp\":\"14\",\"diamonds\":\"10\",\"level\":\"10\",\"missionscomplete\":\"4\"}"]
操作var json = $.parseJSON(data);
之后的json中的值是
["{"id":"1","username":"ghost","points":"5","kills":…diamonds":"0","level":"1","missionscomplete":"1"}", "{"id":"2","username":"seconduser","points":"0","ki…diamonds":"0","level":"0","missionscomplete":"0"}", "{"id":"3","username":"goat","points":"12","kills":…amonds":"10","level":"10","missionscomplete":"4"}"]
答案 0 :(得分:1)
json[0]
是一个对象,所以你想循环键:
var o = json[0];
for (var key in o) {
if (o.hasOwnProperty(key)) {
console.log(key, o[key]);
}
}
答案 1 :(得分:1)
您的JSON数据很乱。它不是你想要的格式。它应该是一个对象数组,而是一个 strings 的数组,其中每个字符串都是您的一个用户对象的JSON表示。
您可以在您的JavaScript代码中对此进行解码,但您不应该这样做。应修复JSON API以生成合理的JSON对象。
我不知道你的服务器代码是什么语言,但它必须做类似这样的伪代码:
array = []
for each userObject in leaderBoard:
userJson = toJSON( userObject )
array.push( userJson )
jsonOutput = toJSON( array )
相反,代码看起来应该更像这样:
array = []
for each userObject in leaderBoard:
array.push( userObject )
jsonOutput = toJSON( array )
换句话说,在大多数语言中生成所需JSON的方法是创建一个具有所需结构的对象或数组,然后调用语言的toJSON
函数(或您使用的任何函数)那个对象或数组。让它一举产生所有的JSON。不要为数组的每个单独元素生成JSON,然后再为整个数组生成JSON。这会为您提供一个字符串数组,您需要一组对象。
你要求的不是你真正想做的事。
您的JSON响应返回一组用户对象,对吗?这就是json[0]
是单个对象的原因。
您可能希望遍历数组,但不要遍历数组中的各个对象。您只需按名称引用其属性即可。
此外,您可以使用$.get()
代替$.parseJSON()
和$.getJSON()
来解析它。
另外还有一个提示:不要将主机名和端口放在URL中。请改用相对URL,然后在开发和生产中使用相同的URL。
因此,出于测试目的,假设您要为排行榜JSON数组中的每个用户记录id
,username
和points
。你可以这样做:
function loadLeaderboard() {
var url = '/l4/public/api/v1/getLeaderboard';
$.getJSON( url, function( leaders ) {
// leaders is an array of user objects, so loop over it
$.each( leaders, function( i, user ) {
// get the properties directly for the current user
console.log( user.id, user.username, user.points );
});
});
}
答案 2 :(得分:1)
您可以只使用JSON的stringify方法-
console.log(JSON.stringify(json[0]));
答案 3 :(得分:0)
jQuery.each()可能是最简单的方法,请查看:http://api.jquery.com/jQuery.each/
例如
$.each(json[0], function(key, data) {
console.log(key + ' -> ' + data);
});
修改强>
以下结果是什么?
function loadLeaderboard(){
$.get("http://localhost:8888/l4/public/api/v1/getLeaderboard",function(data){
var json = $.parseJSON(data);
console.log(json[0]);
for(var i = 0; i < json.length; i++) {
$.each(json[i], function(key, data) {
console.log(key + ' -> ' + data);
});
}
});
}
编辑2:'数据'作为数组返回。
function loadLeaderboard(){
$.get("http://localhost:8888/l4/public/api/v1/getLeaderboard", function(data){
for(var i = 0; i < data.length; i++) {
var json = $.parseJSON(data[i]);
console.log('Data for index: ' + i);
$.each(json, function(key, val) {
console.log(key + ' -> ' + val);
});
}
});
}