递归解析JSON

tjs*_*ons 4 javascript recursion json

我有一个用Python创建的大型JSON对象,我现在需要在网页上显示信息.我的问题是它的大小; 内部有嵌套数组和对象,并且在点处有几层深度.我写了一个非常不优雅(和错误)的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"
        }
    ]
}

谢谢,TJ

小智 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);
Run Code Online (Sandbox Code Playgroud)

不知道它是否适用于所有浏览器,在Chrome和Firefox中都可以

欢呼,伊恩


Sky*_*ers 7

我可以理解你正试图让你的问题更具体,但根本没有足够的信息.

所呈现的json是非常抽象的,大多数键推断出很少或没有数据意义的上下文,结构非常广泛,使得努力收集有意义的意义.

"有意义的"是一个模糊的,相对的和主观的术语.

请尝试浓缩和澄清您的数据范例,并更具体地说明您将如何提出它,您将获得更多运气,获得与您的要求相关的答案和指导.

干杯


这是我最初陈述的问题的原始答案

在您的页面中包含https://github.com/douglascrockford/JSON-js/blob/master/json2.js.如果浏览器没有本机JSON,它将填写.

然后

var myobj = JSON.parse(myjsonstring);
Run Code Online (Sandbox Code Playgroud)

滚动你自己只是一个愚蠢的事情.

祝好运.

  • @tjs然后你的下一步将是"解析"一词,并用你想要做的有用的东西的描述替换它... (3认同)

Lee*_*Lee 1

我建议使用JQuery 的parseJSON()function

JQuery 的实现将使用浏览器的内置JSON.parse()函数(如果存在),如果不存在,它将回退到纯 JavaScript 实现。


[编辑] 正如 @Sky 所指出的,jQuery 实现比json.org提供的参考实现要简单得多,并且在 JSON 源不一定受信任的情况下,这可能会出现一些问题。

我的经验是,jQuery 的解析器正确地使用任何有效的 JSON(如果有人能以其他方式显示,我非常希望看到它)。问题是它还会消耗许多JSON 的东西——也就是说,它会消耗(并评估)任何有效的 javascript 表达式。由于表达式可能包含函数调用,因此如果您的 JSON 来自不受信任的来源,则会出现安全问题。

但是,如果您的 JSON 源是可信的(例如您自己的服务器),那么我认为没有理由因更严格的实现而产生额外的开销(代码大小和性能)。如果您已经出于其他原因(您可能会或可能不会)包含 jQuery 核心,则尤其如此。

当然,所有这些都是相当迂腐的讨论,因为两种实现都会回退到内置浏览器(如果存在)——所有现代浏览器都会这样做。我的观点只是 jQuery 实现有其优点,并且在许多情况下是一个完全有效的选择。在其他情况下,来自json.org的参考实现可能会为您提供更好的服务。

  • 您愿意详细说明一下吗?许多站点和系统每天都使用 jQuery 的 json 解析器。任何使用 jQuery ajax 函数的人都在隐式使用 jQuery json 实现。 (3认同)