2012-07-03 2 views
-1

Я имею в виду много сайтов о рекурсии JSON, как показано нижеJQuery комплекс JSON имя объекта

JavaScript recursion does not work properly
jQuery recursive iteration over objects

, но большинство из них либо знает ключ или итерацию с помощью клавиш знать. Также работают $ .each рабочие скважины, если значение ключа & являются строками, такими как {"firstname": "lastname"} &, тогда функция (k, v) может выдавать значение & как k & v соответственно.

Но в случае, если объект JSON является сложным & мы не, Что приходит, что это ключ может быть любым, например, в JSON1 & JSON2 отличаются в ключах один, три, два в JSON1 заменяется на пять, шесть & десять в JSON2.

JSON1

{ 
    "one": true, 
    "three": [ 
     "red", 
     "yellow", 
     [ 
      "blue", 
      "azure", 
      "cobalt", 
      "teal" 
     ], 
     "orange" 
    ], 
    "two": 19.5 
} 

JSON2

{ 
    "five": true, 
    "six": [ 
     "red", 
     "yellow", 
     [ 
      "blue", 
      "azure", 
      "cobalt", 
      "teal" 
     ], 
     "orange" 
    ], 
    "ten": 19.5 
} 

Если некоторые, как мы можем знать имя ключа & затем сравнить это было бы нормально. легче сравнивать ключи, для этого тэгу следует работать, как предложено в URL ниже

Can jQuery provide the tag name?

Но для обычного объекта JSON атрибут тега не похоже на работу. Проверка атрибутов firefox, таких как text(), attr(), не дает мне tagName. Я хочу, чтобы петля через json-объект (на практике я использую плагин xml2json для преобразования xml в формат выше json) & сравнить ключ, если существует и выполнять действие. Я знаю, что в XML вы можете сделать то же самое, используя имя nodeName. Как я должен делать то же самое с использованием объекта JSON.

+0

Тем не менее я не уверен, что у меня на этот вопрос, но, возможно, вам «Говорят о чем-то вроде указателей JSON (ака XPath для JSON)? В этом случае, возможно, [эта библиотека] (http://goessner.net/articles/JsonPath/) может быть полезна? – raina77ow

+0

Например, если вы итерируете таблицу html, в которой есть строка и ячейки, вы можете написать 3 цикла для каждой таблицы, каждой строки и каждой ячейки, но что, если в каждой ячейке есть таблица внутри нее. Однако здесь вы знаете, что существуют определенные три таблицы тегов, строка и ячейка, но если элементы объекта JSON могут поступать в любом порядке, как указано выше в JSON1 & JSON2, и вы повторяете его, как бы вы знали, что является текущим элементом, не зная tagName. Поэтому, если структура структуры объекта и элементов JSON (key, val) изменяется, как можно узнать, какой текущий ключ и, следовательно, его дочерние элементы обрабатываются – user593029

+0

Неважно, сколько строк и столбцов имеет ваша таблица. Дело в том, что у него есть _rows_ и _columns_; поэтому ваша итерация всегда будет двухуровневой. – raina77ow

ответ

0

Быстрое решение заключается в использовании jQuery.parseJSON http://api.jquery.com/jQuery.parseJSON/

Или вы можете сделать:

вар OBJ = JSON.синтаксический анализ (JSON1);

JSON объект, однако, не поддерживается всеми браузерами, вам, возможно, придется смотреть на: https://github.com/douglascrockford/JSON-js/blob/master/json2.js

включая эту библиотеку не придется менять свой код, так как это делает JSON объект глобальной (в случае, если браузер не поддерживает его).

Он принимает вашу строку JSON, разбирает его, и преобразует его в OBJ Так JSON1 вы получите что-то вроде:

obj.one дает вам значение = истина

obj.two давая вы значение = [ "красный", "желтый", [ "синий", "лазурь", "кобальт", "чирок"], "оранжевый"]

obj.three дает вам значение = 19,5

Затем вы можете пройти через объекты obj:

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) {   
     switch(prop){ 
     { 
      case "one": 
       //Do stuff here 
       break; 
      case "two": 
       //Do stuff here 
       break; 
      case "three": 
       //Do stuff here 
       break; 
     } 
    } 
} 

Кроме того, использование obj [prop] даст вам значения, а не имена. Например, во время цикла, если вы обнаружите, что: проп = «три»

затем:

OBJ [проп] = 19,5

+0

Я думаю, что это сработает, но мы можем делать динамически, а также без использования case switch и без использования оператора точки, например obj.one или obj.two будет работать, если мы знаем все комбинации, но что, если мы не знаем самого имени прозвища. можем ли мы иметь массивы всех атрибутов, к которым можно получить доступ, используя индекс.возможно, не уверен, что я нахожу странным – user593029

+0

Вы бы поставили себя в угол. Вы не можете ослепить свой проект, получив неожиданные значения ключей из объекта JSON. Ключом к хорошему коду и проектной практике является знание ваших вкладов и их последовательное соблюдение. – sksallaj

+0

Однако я могу сказать, что ваш формат JSON согласован, поэтому я бы получил позицию ключа, а не имя. Если вы знаете, что первый узел каждого файла JSON для чего-то, а также второй и третий, вы можете просто сделать счет в цикле «for», и это может привести вас куда ближе к тому, что вы, вероятно, захотите. – sksallaj

0

Я не совсем уверен, что вы ищете, но я выброшу это здесь.

Если вы используете что-то вроде for (key in jsonObj) { ... }, вы можете проходить через объект без знания имени ключа. Внутри цикла key предоставит вам текущее имя ключа, а jsonObj[key] предоставит вам соответствующее значение.

Например, если мы используем ваш "JSON1" объект:

for(key in JSON1) 
{ 
    alert(key + ": " + JSON1[key]); 
} 

Первое предупреждение будет отображаться: one: true.

Я подозреваю, что вы также можете сделать это рекурсивным для доступа к вложенным объектам.

+0

Я думаю, что это должно сработать. много. Я пробовал $ .each, но это не работает. & Дайте мне правильный ключ, скорее мне дает номер 0. – user593029

+0

Наконец, как бы вы знали количество атрибутов, связанных с объектом, например, если таблица имеет ширину свойства, высоту, которая может быть доступна как table.width & table.height, используя элемент доступа к точкам, но в моем случае я не знаю, какая из них может иметь комбинацию, т. е. может быть table.x table.y и т. д. Также я не знаю имени члена, которого он мог бы быть x, y или z или вообще ничего, как я могу это сделать – user593029

Смежные вопросы