1

我正在使用 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\"}"] 

操作后json中的var json = $.parseJSON(data);值为

["{"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"}"]
4

4 回答 4

4

您可以只使用 JSON 的 stringify 方法-

console.log(JSON.stringify(json[0]));

于 2019-06-07T05:37:38.320 回答
2

更新

你的 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 )

换句话说,在大多数语言中生成所需的 JSON 的方法是创建具有所需结构的对象或数组,然后toJSON在该对象或数组上调用语言的函数(或您使用的任何函数)。让它一举生成所有的 JSON。不要为数组的每个单独元素生成 JSON,然后为整个数组再次生成 JSON。这为您提供了一个字符串数组,您需要一个对象数组。

原始答案

你所要求的并不是你真正想做的。

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

您可能希望遍历该数组,但不要遍历数组中的各个对象。您只需按名称引用它们的属性。

此外,您可以使用which 为您解析它,而不是使用$.get()and 。$.parseJSON()$.getJSON()

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

因此,出于测试目的,假设您要为排行榜 JSON 数组中的每个用户记录idusernamepoints。你可以这样做:

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 );
        });
    });
}
于 2013-09-21T03:49:38.153 回答
1

json[0]是一个对象,所以你想遍历键:

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

工作小提琴:http: //jsfiddle.net/UTyDa/

于 2013-09-21T03:26:33.393 回答
1

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);
            });
    }
    });
}
于 2013-09-21T04:05:56.537 回答