用JavaScript打印JSON字典

用JavaScript打印JSON字典,javascript,Javascript,我使用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://l

我使用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(数据)后的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"}"]

json[0]
是一个对象,因此您希望在键上循环:

var o = json[0];
for (var key in o) {
    if (o.hasOwnProperty(key)) {
        console.log(key, o[key]);
    }
}

工作小提琴:

json[0]
是一个对象,因此您希望在键上循环:

var o = json[0];
for (var key in o) {
    if (o.hasOwnProperty(key)) {
        console.log(key, o[key]);
    }
}
工作小提琴:

更新 你的JSON数据乱七八糟。这不是你想要的格式。它应该是一个对象数组,但它是一个字符串数组,其中每个字符串都是一个用户对象的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 )
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 );
        });
    });
}
换句话说,在大多数语言中生成所需JSON的方法是创建一个具有所需结构的对象或数组,然后在该对象或数组上调用该语言的
toJSON
函数(或您使用的任何函数)。让它一下子生成所有JSON。不要为数组的每个元素生成JSON,然后为整个数组再次生成JSON。这将为您提供一个字符串数组,其中需要一个对象数组

原始答案 你所要求的并不是你真正想做的

JSON响应返回一个用户对象数组,对吗?这就是为什么
json[0]
是单个对象的原因

您可能希望在该数组上循环,但不会在数组中的单个对象上循环。您只需按名称引用它们的属性

另外,您可以使用
$.getJSON()
来解析它,而不是使用
$.get()
$.parseJSON()

还有一个提示:不要将主机名和端口放在URL中。使用相对URL,然后您可以在开发和生产中使用相同的URL

因此,出于测试目的,假设您希望为排行榜JSON数组中的每个用户记录
id
用户名
、和
点数。你可以这样做:

array = []
for each userObject in leaderBoard:
    array.push( userObject )
jsonOutput = toJSON( array )
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 );
        });
    });
}
更新 你的JSON数据乱七八糟。这不是你想要的格式。它应该是一个对象数组,但它是一个字符串数组,其中每个字符串都是一个用户对象的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 )
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 );
        });
    });
}
换句话说,在大多数语言中生成所需JSON的方法是创建一个具有所需结构的对象或数组,然后在该对象或数组上调用该语言的
toJSON
函数(或您使用的任何函数)。让它一下子生成所有JSON。不要为数组的每个元素生成JSON,然后为整个数组再次生成JSON。这将为您提供一个字符串数组,其中需要一个对象数组

原始答案 你所要求的并不是你真正想做的

JSON响应返回一个用户对象数组,对吗?这就是为什么
json[0]
是单个对象的原因

您可能希望在该数组上循环,但不会在数组中的单个对象上循环。您只需按名称引用它们的属性

另外,您可以使用
$.getJSON()
来解析它,而不是使用
$.get()
$.parseJSON()

还有一个提示:不要将主机名和端口放在URL中。使用相对URL,然后您可以在开发和生产中使用相同的URL

因此,出于测试目的,假设您希望为排行榜JSON数组中的每个用户记录
id
用户名
、和
点数。你可以这样做:

array = []
for each userObject in leaderBoard:
    array.push( userObject )
jsonOutput = toJSON( array )
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 );
        });
    });
}
each()可能是最简单的方法,请检查以下内容:

乙二醇

编辑:

下面的结果是什么

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);
            });
        }
    });
}
功能加载排行榜(){
$.get(”http://localhost:8888/l4/public/api/v1/getLeaderboard,函数(数据){
var json=$.parseJSON(数据);
log(json[0]);
for(var i=0;i'+数据);
});
}
});
}
编辑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);
            });
    }
    });
}
功能加载排行榜(){
$.get(”http://localhost:8888/l4/public/api/v1/getLeaderboard,函数(数据){
对于(变量i=0;i'+val);
});
}
});
}
jQuery.each()可能是最简单的方法,请查看以下内容:

乙二醇

编辑:

下面的结果是什么

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);
            });
        }
    });
}
功能加载排行榜(){
$.get(”http://localhost:8888/l4/public/api/v1/getLeaderboard,函数(数据){
var json=$.parseJSON(数据);
log(json[0]);
for(var i=0;i'+数据);
});
}
});
}
编辑2: