簡體   English   中英

我的遞歸JSON解析器中的錯誤在哪里?

[英]Where is the bug in my recursive JSON parser?

我想創建一個遞歸函數來解析類似於json的數據,如下所示。 當key為xtype時,將創建一個新類。 特別是,當xtype = gridpanel / treepanel時,所有屬性都必須是其構造函數參數,否則,將在創建類后添加屬性。 我的遞歸函數如下,在ext-all.js的第21行出現錯誤“太多遞歸”。

請看看,我如何解決這個問題?

主程序中的代碼:

    me.recursiveParser(null, data.json);
    Ext.apply(me.root, me.parent);
    me.desktopCfg = me.root;

recursiveParser函數:

    recursiveParser: function(nodeName, jsonData) {
             var properties = {};
             var isSpecial = false;
             var isLeaf = true;
             var parent, child, special;

              //Base factor
                    for (var key in jsonData) {
                      var value = jsonData[key];
                      //To collect all the properties that is only initialized with '@'.
                      if (key.toString().indexOf("@") === 0) {
                                key = key.replace("@", "");
                                if(typeof(value) === "string"){
                                     properties[key] = "'"+value+"'";
                                }else{
                                      //Later, should have to deal with the empty value or array with no keys and only elements.
                                      properties[key] = value;
                                }
                                if(key === "xtype"){
                                     //To initialize the root
                                     if(nodeName === null){
                                         this.root = this.createNewObject(value, null);
                                     }

                                     if(value === "gridpanel" || value === "treepanel"){
                                             isSpecial = true;
                                             special = value;
                                     }else{
                                             child = this.createNewObject(value, null);
                                     }
                                }  
                      }else {
                          isLeaf = false;
                      }
                    }

                    if(isSpecial){
                        child = this.createNewObject(special, properties);
                    }

                    //To add the subnode and its properties to its parent object.
                    if (nodeName !== null && typeof(nodeName) === "string") {
                       if(child === null){
                           Ext.apply(parent, properties);

                       }else{
                           Ext.apply(parent, child);
                       }
                    }

                    if(isLeaf){
                        return;
                    }
                    for (var key in jsonData) {
                        var value = jsonData[key];
                        if (key.toString().indexOf("@") === 0) {
                            continue;
                        }else{
                           if(value === "[object Object]"){
                               for(var index in value){
                                   this.recursiveParser(key, value[index]);                                
                               }
                           }else{                                   
                               this.recursiveParser(key, value);
                           }
                           Ext.apply(this.root, parent);
                        }
                    }
}

createNewObject函數:

createNewObject: function(objType, properties){
    if(objType){
                    switch (objType){
                        case "gridpanel":
                            return new MyProg.base.GridPanel(properties);
                            break;

                        case "treepanel":
                            return new MyProg.base.TreePanel(properties);
                            break;

                        case "tabpanel":
                            return new MyProg.base.TabPanel();

                            break;

                        case "tab":
                            return new MyProg.base.Tabs();
                            break;

                        case "formpanel":
                            return new MyProg.base.Accordion(); 
                            break;

                        case "fieldset":
                            return new MyProg.base.FieldSet(); 
                            break;

                        case "textfield":
                            return new MyProg.base.Fields(); 
                            break;

                        case "panel":
                            return new MyProg.base.Accordion(); 
                            break;

                        default:
                            return new MyProg.base.Accordion(); 

                    };
    };
}

data.json:

var data = {
            "json": {
                        "@title": "BusinessIntelligence",
                        "@xtype": "tab",
                        "@layout": "accordion",
                        "items": [
                            {
                                "@title": "SalesReport",
                                "@ctitle": "SalesReport",
                                "@layout": "column",
                                "items": [
                                    {}
                                ]
                            },
                            {
                                "@title": "ContentPlayingReport",
                                "@ctitle": "ContentPlayingReport",
                                "@layout": "column",
                                "items": [
                                    {}
                                ]
                            },
                            {
                                "@title": "BusinessIntelligence",
                                "@ctitle": "BusinessIntelligence",
                                "@layout": "column",
                                "items": [
                                    {}
                                ]
                            }
                        ]
                    }
}

我修改了遞歸部分,現在看起來更優雅了。 所有的xtype都可以正常工作,除了gridpanel之外,我已經檢查了DOM,所有內容都在其中,但仍然收到錯誤消息:

TypeError: c is undefined
...+g.extraBaseCls);delete g.autoScroll;if(!g.hasView){if(c.buffered&&!c.remoteSort...  
ext-all.js (line 21, col 1184416)

我懷疑這是一個ExtJS錯誤。 我將嘗試尋找另一種出路。

遞歸程序:

recursiveParser: function (jsonData) {
    var me = this;
    var properties = {};

    for ( var key in jsonData ){
        var value = jsonData[key];
        var items = (value.constructor === Array) ? [] : {};
        if (value instanceof Object) {
            if (isNaN(key)){
                if (items.constructor === Array) {
                    for (var node in value){
                        items.push(me.recursiveParser(value[node]));
                    }
                    properties[key] = items;

                } else {
                    properties[key] = me.recursiveParser(value);
                }
            } else {
                return me.recursiveParser(value);
            }
        } else {
                if (key.toString().indexOf('@') === 0){
                    key = key.replace('@', '');
                    properties[key] = value;
                }                    
        }
    }
    return properties;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM