在未命名的json数组url中检索值

retrieve value in unnamed json array url

本文关键字:检索 url 数组 未命名 json      更新时间:2023-09-26

我很难在这个url中检索json上的一些值:

http://go-gadget.googlecode.com/svn/trunk/test.json

url数据如下所示:

[
{
    "key":{
        "parentKey":{
            "kind":"user",
            "id":0,
            "name":"test 1"
        },
        "kind":"smsgateway",
        "id":5707702298738688
    },
    "propertyMap":{
        "content":"test1 content",
        "date":"Dec 12, 2013 2:58:57 PM",
        "user":"test1"
    }
}]

通过忽略"键",我想使用javascript代码访问"propertyMap"对象的值(内容、日期和用户)。我尝试过这个代码,但无法得到结果:

var url = "http://go-gadget.googlecode.com/svn/trunk/test.json";
$.getJSON(url, function (json) {
for (var i = 0; i < json.length; i = i + 1) {
    var content = json[i].propertyMap.content;
    console.log('content : ', content);
    var user = json[i].propertyMap.user;
    console.log('user: ', user);
    var date = json[i].propertyMap.date;
    console.log('date : ', date);
    }
    });

(此处为不成功代码http://jsfiddle.net/KkWdN/)

考虑到这个json不能更改,我从上面的代码中犯了什么错误吗?或者有其他技术可以得到结果吗?

我只学习了一个月的javascript和json,所以非常感谢通过一个例子做出的回应。

--edited:我将[].length更改为json.length,现在我正在寻找访问url 的答案

这将类似于:

$.getJSON("http://go-gadget.googlecode.com/svn/trunk/test.json", function(json) {
    for (var i = 0; i < json.length; i++) {
        var map     = json[i].propertyMap;
        var content = map.content;
        var user    = map.user;
        var date    = map.date;
        $('#date').text(date);
        $('#nohp').text(user);
        $('#content').text(content);
    }
});

但请求失败,因为请求的资源上不存在"Access Control Allow Origin"标头,因此您被同源策略

阻止

你觉得[].length怎么样将评估为。

它是0,所以它永远不会进入for循环。

除此之外,你的代码看起来还可以。

将for循环替换为以下

$.getJSON(url, function (json) {
    for (var i = 0; i < json.length; i = i + 1) {

此外,您似乎正在访问作为不同域的一部分的API。因此,如果您想从不同的域检索数据,则需要使用CORSJSONP来实现此功能。

更改:

for (var i = 0; i < [].length; i = i + 1) {

for (var i = 0; i < json.length; i = i + 1) {

此处演示

使用以下内容如何在你的情况下,假设对象是myObj,我会得到这样的值

var content = fetchValue(myObj, [0, "propertyMap", "content"], "");
var date = fetchValue(myObj, [0, "propertyMap", "date"], new Date());
var user = fetchValue(myObj, [0, "propertyMap", "user"], "");

只是为了确保我们发送一个默认值,以防我们没有得到所需的ojbect。这种方法的美妙之处在于,现在您不必担心数组或嵌套在结构中的对象。fetchValue函数可能如下所示。

function fetchValue(object, propertyChain, defaultValue){
    var returnValue;
    try{
         returnValue = object;
         forEach(propertyChain, function(element){
            returnValue = returnValue[element];
         });
    }catch(err){
        return defaultValue;
    }
    if(returnValue == undefined) {
        returnValue = defaultValue;
    }
    return returnValue;
}

添加forEach功能

function forEach(array, action){
    for(var x in  array)
        action(array[x]);
}