Рекурсивно разбор JSON - PullRequest
       7

Рекурсивно разбор JSON

4 голосов
/ 05 ноября 2010

У меня есть большой объект JSON, который я создал с помощью Python, и теперь мне нужно отобразить информацию на веб-странице. Моя проблема в размере этого; внутри есть вложенные массивы и объекты, а в точках - несколько слоев. Я написал крайне не элегантную (и глючную) функцию JavaScript для извлечения данных, но это кажется мне рекурсивной проблемой, и я, к сожалению, не привык так думать (пока).

Кто-нибудь знает о хорошем решении разбора чтения такого объекта? Моя цель здесь - действительно прочитать это несколько динамически, поскольку мне придется делать это много раз (и каждый раз, когда объект будет отличаться, но с более или менее одинаковой структурой). Цель состоит в том, чтобы взять эту информацию и показать ее осмысленно на веб-странице.

Дайте мне знать, если я могу уточнить дальше.

Редактировать: вот объект. Я был вдали от своего компьютера, когда я отправил это, плюс это довольно большой. Части, которые могут быть чувствительными, я вытащил. И я использую JSON2, чтобы разобрать это в нечто иное, чем строка. Это просто размер и злобность, которые доставляют мне проблемы.

{ "Loop300": [ { "Loop310": [ { "N1": { "idCode": "0400", "idQual": "ZZ", "name": "REDACTED", "entIdCode": "SF" }, "N3": [ { "address1": "REDACTED", "address2": "REDACTED" } ], "G61": [ { "contactFunctionCode": "CN", "commNumber": "REDACTED", "commNumQualifier": "TE", "name": "shipping" } ], "N4": [ {} ] } ], "L11": [], "S5": { "stopReasonCode": "LD", "stopSeqNum": "1" }, "Loop350": [ { "LAD": [], "OID": { "weight": "161", "poNum": "ASDF", "weightCode": "L", "unitMeasure": "CA", "refID": "THING", "quantity": "6" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "1", "desc": "STUFF" } } ] }, { "LAD": [], "OID": { "weight": "104", "poNum": "ZXMO", "weightCode": "L", "unitMeasure": "CA", "refID": "STUFF", "quantity": "6" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "2", "desc": "STUFF" } } ] }, { "LAD": [], "OID": { "weight": "1833", "poNum": "ASDF", "weightCode": "L", "unitMeasure": "CA", "refID": "THEBLOB", "quantity": "40" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "3", "desc": "STUFF" } } ] }, { "LAD": [], "OID": { "weight": "229", "poNum": "FDSA", "weightCode": "L", "unitMeasure": "CA", "refID": "BATMAN", "quantity": "6" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "4", "desc": "STUFF" } } ] } ], "AT5": [], "G62": [ { "date": "20100817", "datequalifier": "10" }, { "date": "20100817", "datequalifier": "38" } ], "NTE": [ { "refCode": "OTH", "desc": "No Touch" } ] }, { "Loop310": [ { "N1": { "idCode": "9998000006", "idQual": "ZZ", "name": "REDACTED", "entIdCode": "SF" }, "N3": [ { "address1": "REDACTED" } ], "G61": [ { "contactFunctionCode": "CN", "commNumber": "REDACTED", "commNumQualifier": "TE", "name": "REDACTED" } ], "N4": [ {} ] } ], "L11": [], "S5": { "stopReasonCode": "LD", "stopSeqNum": "2" }, "Loop350": [ { "LAD": [], "OID": { "poNum": "QWERTY", "refID": "ASDF", "unitMeasure": "PL", "quantity": "1" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "1", "desc": "PORT" } } ] } ], "AT5": [], "G62": [ { "date": "20100817", "datequalifier": "10" }, { "date": "20100817", "datequalifier": "38" } ], "NTE": [ { "refCode": "OTH", "desc": "Driver Count Required" } ] }, { "Loop310": [ { "N1": { "idCode": "9998000070", "idQual": "ZZ", "name": "PLACE", "entIdCode": "ST" }, "N3": [ { "address1": "PLACE" } ], "G61": [ { "contactFunctionCode": "CN", "commNumber": "XXXXXXXXXX", "commNumQualifier": "TE", "name": "X" } ], "N4": [ {} ] } ], "L11": [], "S5": { "stopReasonCode": "UL", "stopSeqNum": "3" }, "Loop350": [ { "LAD": [], "OID": { "poNum": "JOE", "refID": "SUPERMAN", "unitMeasure": "PL", "quantity": "1" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "1", "desc": "PORT" } } ] } ], "AT5": [], "G62": [ { "date": "20100817", "datequalifier": "68" }, { "date": "20100817", "datequalifier": "54" } ], "NTE": [ { "refCode": "OTH", "desc": "No Touch" } ] }, { "Loop310": [ { "N1": { "idCode": "0000403803", "idQual": "ZZ", "name": "REDACTED", "entIdCode": "ST" }, "N3": [ { "address1": "REDACTED" } ], "G61": [ { "contactFunctionCode": "CN", "commNumber": "0000000000", "commNumQualifier": "TE", "name": "REDACTED" } ], "N4": [ {} ] } ], "L11": [ { "qualifier": "DO", "refID": "THETHING" } ], "S5": { "stopReasonCode": "UL", "stopSeqNum": "4" }, "Loop350": [ { "LAD": [], "OID": { "weight": "161", "poNum": "UIP", "weightCode": "L", "unitMeasure": "CA", "refID": "JACK", "quantity": "6" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "1", "desc": "STUFF" } } ] }, { "LAD": [], "OID": { "weight": "104", "poNum": "JKLM", "weightCode": "L", "unitMeasure": "CA", "refID": "SUSAN", "quantity": "6" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "2", "desc": "STUFF" } } ] }, { "LAD": [], "OID": { "weight": "1833", "poNum": "ASDF", "weightCode": "L", "unitMeasure": "CA", "refID": "JOE", "quantity": "40" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "3", "desc": "STUFF" } } ] }, { "LAD": [], "OID": { "weight": "229", "poNum": "AAAA", "weightCode": "L", "unitMeasure": "CA", "refID": "ASDF", "quantity": "6" }, "Loop360": [ { "Loop365": [], "L5": { "lineNum": "4", "desc": "STUFF" } } ] } ], "AT5": [], "G62": [ { "date": "20100817", "datequalifier": "68" }, { "date": "20100817", "datequalifier": "54" } ], "NTE": [ { "refCode": "OTH", "desc": "Driver Assist Required" } ] } ], "SE": { "numSegments": "70", "controlNum": "0002" }, "Loop100BT": [], "L11": [ { "qualifier": "VD", "refID": "SALLY" }, { "qualifier": "SI", "refID": "MARK" }, { "qualifier": "CR", "refID": "JOE" }, { "qualifier": "RB", "refID": "USD" }, { "qualifier": "TH", "refID": "REDACTED" } ], "PLD": [], "L3": { "weight": "2328", "advances": "0", "rateQual": "FR", "charge": "05", "freightRate": "", "weightQual": "G", "quantity": "59" }, "B2": { "ordernum": "12345", "paymethod": "PP", "scac": "XXXX" }, "Loop100VI": [ { "N1": { "name": "REDACTED", "entIdCode": "AA" }, "G61": [ { "contactFunctionCode": "CN", "commNumber": "REDACTED", "contactReference": "0563", "commNumQualifier": "TE", "name": "REDACTED" }, { "contactFunctionCode": "IC", "commNumber": "REDACTED", "commNumQualifier": "EM", "name": "REDACTED" }, { "contactFunctionCode": "ZZ", "name": "REDACTED" } ] } ], "G62": [ { "date": "20100827", "timequalifier": "1", "datequalifier": "64", "time": "1302" } ], "Loop100CB": [], "NTE": [ { "refCode": "ZZZ", "desc": "26" }, { "refCode": "OTH", "desc": "No Touch" }, { "refCode": "OTH", "desc": "Driver Count Required" }, { "refCode": "OTH", "desc": "No Touch" }, { "refCode": "OTH", "desc": "Driver Assist Required" } ], "B2A": { "purpose": "00" }, "N7": [ { "equipLength": "4800", "equipHeight": "0", "weight": "2328", "equipWidth": "0", "equipNum": "ZZZZ", "equipType": "TV", "weightQual": "G" } ] }

Спасибо, T.J.

Ответы [ 4 ]

8 голосов
/ 11 июля 2011

Вы имеете в виду что-то подобное?

function iterateAttributesAndFormHTMLLabels(o){
    var s = '';
    for(var a in o){
        if (typeof o[a] == 'object'){
            s+='<label><font color=green>'+a+':</font></label><br />';
            s+=iterateAttributesAndFormHTMLLabels(o[a]);
        }else{
            s+='<label>'+a+': <font color=blue>'+o[a]+'</font></label><br />';
        }//end if
    }//end for
    return s;
}//end function

data = {...};

var html = iterateAttributesAndFormHTMLLabels(data);

Не знаю, работает ли он во всех браузерах, работает в Chrome и Firefox

ура, Ian

7 голосов
/ 05 ноября 2010

Я могу оценить, что вы пытаетесь сделать свой вопрос более конкретным, но информации просто не хватает.

Представленный json является чрезвычайно абстрактным, большинство ключей мало или вообще не отражают смысл значенияданные, структура довольно обширна, что делает попытку найти значение проблематичным.

«Значимый» - это неоднозначный, относительный и субъективный термин.

Пожалуйста, постарайтесь сжать и уточнить ваш пример данных и более точно указать, как вы предлагаете его представить, и вам больше повезет, если вы получите ответы и рекомендации, соответствующие вашим требованиям.1009 *


это мой первоначальный ответ на вопрос, который был первоначально сформулирован

Включить https://github.com/douglascrockford/JSON-js/blob/master/json2.js на своей странице.Если в браузере нет нативного JSON, он заполнится.

, тогда

var myobj = JSON.parse(myjsonstring);

сворачивать свой собственный - просто глупо.

Удачи.

1 голос
/ 05 ноября 2010

Я бы предложил parseJSON() функцию JQuery .

Реализация JQuery будет использовать встроенную в браузер функцию JSON.parse(), если она существует, а если нет, она упадетВозвращаясь к чистой реализации javascript.


[edit], как указывает @Sky, реализация jQuery существенно проще, чем эталонная реализация, предоставляемая json.org , и этоможет представлять некоторые проблемы в тех случаях, когда источник вашего JSON не обязательно доверять.

Мой опыт показывает, что парсер jQuery будет правильно потреблять любой действительный JSON (если кто-то может показать иначе, я бы очень хотел это увидеть).Проблема в том, что он будет также потреблять ряд вещей, которые не являются JSON, а именно, он будет принимать (и оценивать) любое допустимое выражение javascript.Поскольку выражения могут содержать вызовы функций, это может представлять проблему безопасности, если ваш JSON исходит из ненадежного источника.

Однако, если источник вашего JSON является доверенным (например, ваш собственный сервер), тогда я не вижу причин, чтобы нести дополнительные издержки (как размера кода, так и производительности) более строгой реализации.Это особенно верно, если вы уже включили ядро ​​jQuery по другим причинам (которые вы можете или не можете быть).

Конечно, все это довольно педантичное обсуждение,поскольку обе реализации возвращаются к встроенному браузеру, если он существует - что он делает во всех современных браузерах.Я просто хочу сказать, что реализация jQuery имеет свои сильные стороны и является вполне приемлемым выбором во многих сценариях.В других ситуациях вам может быть удобнее справочная реализация из json.org .

0 голосов
/ 05 ноября 2010

Вы можете использовать шаблонизатор JS для преобразования JSON в понятный человеку HTML.

Вот пример рекурсии с использованием библиотеки шаблонов PURE: http://beebole.com/pure/documentation/recursion-example/

Шаблон здесь довольно общий, с использованием комбинации UL/LI.

Илинапример, вы хотите отобразить его в текстовом поле, которое вы можете использовать JSON.stringify:

document.getElementById('theTextBox').value = JSON.stringify(theJson, null, 2);

Вышеуказанный вызов stringify сделает отступ в JSON с двумя пробелами.

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