用JavaScript打印JSON字典

时间:2013-09-21 03:22:46

标签: 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://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"}"]

4 个答案:

答案 0 :(得分: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/

答案 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数组中的每个用户记录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 );
        });
    });
}

答案 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);
            });
    }
    });
}