2010-11-05 9 views
4

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

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

Сообщите мне, если я смогу подробнее остановиться.

Редактировать: Вот и объект. Я был вдали от своего компьютера, когда я разместил его, плюс он довольно большой. Части, которые могут быть чувствительными, я вытащил. И я использую 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.

+0

Эй @tjsimmons, вы можете показать нам структура вашего JSON? –

+3

'Кто-нибудь знает о хорошем решении синтаксического разбора такого объекта?« Показать * объект * может помочь. –

+0

Задать вопрос до убийства и выполнить поиск перед тем, как делать :) –

ответ

1

Я предлагаю JQuery's parseJSON() function.

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


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

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

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

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

+0

Мне было бы сложно назвать менее способную реализацию json, чем jquery's. –

+3

Не хотите ли вы разработать? Многие сайты и системы используют json parser jQuery каждый день. Любой, кто использует функции jQuery ajax, неявно использует реализацию jQuery json. – Lee

+0

@Sky: Мне было бы интересно также. JSON не совсем сложный формат, я бы даже назвал его * hard *, чтобы реализовать его неправильно или не полностью. – Tomalak

7

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

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

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

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

Приветствия


это мой оригинальный ответ на вопрос, как первоначально заявлено

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

затем

var myobj = JSON.parse(myjsonstring); 

прокатки свой собственный просто глупо, что нужно сделать.

Удачи.

+0

Да, я имел в виду синтаксический анализ, как в родовом «делать что-то значимое». Я использовал json2.js для изменения строки в том, что я написал выше. – tjsimmons

+3

@tjs, то ваш следующий шаг будет удалять термин «разбор» и заменить его описанием того, что это полезная вещь, которую вы хотите сделать ... –

+0

Выполнено и сделано. Было довольно поздно, когда я отправил эту последнюю ночь, и я некоторое время смотрел на нее. Я добавил то, что я на самом деле хочу сделать с информацией в исходное сообщение. – tjsimmons

0

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

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

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

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

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

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

8

Сделайте что-нибудь вроде этого?

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

Cheers, Ян

+0

он работает очень хорошо, спасибо;) – OhMyGeo

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