将HTTP地址放在javascript变量中以进行json解析

时间:2011-08-02 13:25:17

标签: jquery json parsing variables

如果我要使用这个外部json文件:

{
"http://example.org/about" :
    {
        "http://purl.org/dc/elements/1.1/title" : [{"value" : "annas homepage" , "type" : "literal"}]
    }
}

和这个外部jquery脚本在json文件中获取书的标题:

var a = 'http://example.org/about'
var b = 'http://purl.org/dc/elements/1.1/title'

$(document).ready(function() {
  $("#trigger").click(function(event) {
    $.getJSON('rdfjson.json', function(json) {
      $('#meta').html('Title: ' + json.a.b[0].value);
    });
  });
});

和这个HTML代码:

<p>Click on the button to fetch data from json structure:</p>
<div id="meta">
This text will be overwritten.
</div>
<input type="button" id="trigger" value="Load Data" />

为什么它不起作用?当我在json文档和脚本中使用普通字符串时,它可以正常工作。

另外,我不明白我如何迭代整个json文件,例如,如果它更复杂或元素包含长数据包含数据等等。

非常感谢!

4 个答案:

答案 0 :(得分:3)

因为您要查找的对象成员名为 a,而不是名称为值的对象成员存储在变量“a”中

使用“方括号表示法”而不是使用“点符号”,而不是

$('#meta').html('Title: ' + json[a][b][0].value);

有关详细信息,请参阅此处:http://www.dev-archive.net/articles/js-dot-notation/

修改

如果JSON结构如此变化:

  1. 第一版:

    {
        "http://example.org/about" :
        {
            "http://purl.org/dc/elements/1.1/title" : [{"value" : "annas homepage" , "type" : "literal"}]
        }
    }
    
  2. 第二版:

    {
        "http://somewhereelse.com/something" :
        {
            "http://anotherplace.org/dc/blah-blah-blah/title" : [{"value" : "annas homepage" , "type" : "literal"}]
        }
    }
    
  3. <强> e.g。总有一个对象,其中一个成员有一个成员

    ...你需要针对它:

    $.getJSON('rdfjson.json', function(obj) {
      for (var x in obj) {
          if (obj.hasOwnProperty(x)) {
             var obj2 = obj[x];
    
             for (var x in obj2) {
                if (obj2.hasOwnProperty(x)) {
                    $('#meta').html('Title: ' + obj2[x][0].value);
                }
             }
          }
      }
    });
    

    如果你知道关于你需要遍历的路径的更多信息,你当然可以在for循环中添加条件:

    $.getJSON('rdfjson.json', function(obj) {
      for (var x in obj) {
          // if you know you're looking for a key that begins with "http://"
          if (obj.hasOwnProperty(x) && x.indexOf("http://") === 0) { 
             var obj2 = obj[x];
    
             for (var x in obj2) {
                // Check that the value is an array of at least length 1, and whose 1st value has the property "value".
                if (obj2.hasOwnProperty(x) && obj2[x] instanceof Array && obj2[x].length > 0 && obj2[x][0].value) { 
                    $('#meta').html('Title: ' + obj2[x][0].value);
                }
             }
          }
      }
    });
    

答案 1 :(得分:0)

您需要使用方括号表示法:

json[a][b][0].value

允许您使用变量选择属性(不能使用点表示法)。

请参阅http://www.jibbering.com/faq/faq_notes/square_brackets.html

答案 2 :(得分:0)

  $('#meta').html('Title: ' + json.a.b[0].value);

应该是

  $('#meta').html('Title: ' + json[a][b][0].value);

答案 3 :(得分:0)

使用方括号,如sp:

json[a][b][0].value

此处的小测试案例:http://jsfiddle.net/sSbtq/