Помещение HTTP-адреса в переменную javascript для анализа json - PullRequest
1 голос
/ 02 августа 2011

Если мне нужен этот внешний файл 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 ]

3 голосов
/ 02 августа 2011

Поскольку вы ищете элемент объекта с именем 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"}]
        }
    }
    

например, всегда естьодин объект, у которого есть один член, у которого есть один член

... и вам нужно нацелить его:

$.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);
            }
         }
      }
  }
});
0 голосов
/ 02 августа 2011

Используйте квадратные скобки, такие как sp:

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

Маленький тестовый пример здесь: http://jsfiddle.net/sSbtq/

0 голосов
/ 02 августа 2011
  $('#meta').html('Title: ' + json.a.b[0].value);

должно быть

  $('#meta').html('Title: ' + json[a][b][0].value);
0 голосов
/ 02 августа 2011

Вам необходимо использовать квадратную скобку:

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

, что позволит вам выбирать свойства, используя переменные (что вы не можете делать с точечной нотацией).

См. http://www.jibbering.com/faq/faq_notes/square_brackets.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...