使用具有不同子字段的 JSON 加载 TreeStore

Posted

技术标签:

【中文标题】使用具有不同子字段的 JSON 加载 TreeStore【英文标题】:Loading TreeStore with JSON that has different children fields 【发布时间】:2012-08-23 12:57:38 【问题描述】:

我有如下 JSON 数据。


    "divisions": [
        "name": "division1",
        "id": "div1",
        "subdivisions": [
            "name": "Sub1Div1",
            "id": "div1sub1",
            "schemes": [
                "name": "Scheme1",
                "id": "scheme1"
            , 
                "name": "Scheme2",
                "id": "scheme2"
            ]
        , 
            "name": "Sub2Div1",
            "id": "div1sub2",
            "schemes": [
                "name": "Scheme3",
                "id": "scheme3"
            ]
        

        ]
    ]

我想将其读入 TreeStore,但无法将子字段(divisionssubdivisionsschemes)更改为相同(例如,children)。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

当嵌套的 JSON 加载到 TreeStore 中时,基本上子节点是通过 TreeStore.fillNode() 方法和 NodeInterface.appendChild() 之间的递归调用加载的。

每个节点的children字段的实际检索在这一行的TreeStore.onNodeAdded()内完成:

dataRoot = reader.getRoot(data);

阅读器的getRoot() 是在阅读器的buildExtractors() 方法中动态创建的,为了处理嵌套JSON 中的不同子字段,您需要重写该方法。这是如何完成的:

Ext.define('MyVariJsonReader', 
    extend: 'Ext.data.reader.Json',
    alias : 'reader.varijson',

    buildExtractors : function()
    
        var me = this;    
        me.callParent(arguments);

        me.getRoot = function ( aObj )                 
            // Special cases
            switch( aObj.name )
            
                case 'Bill':   return aObj[ 'children' ];
                case 'Norman': return aObj[ 'sons' ];                    
            

            // Default root is `people`
            return aObj[ 'people' ];
        ;
    
);

这样就能解释这样的JSON:


   "people":[
      
         "name":"Bill",
         "expanded":true,
         "children":[
            
               "name":"Kate",
               "leaf":true
            ,
            
               "name":"John",
               "leaf":true
            
         ]
      ,
      
         "name":"Norman",
         "expanded":true,
         "sons":[
            
               "name":"Mike",
               "leaf":true
            ,
            
               "name":"Harry",
               "leaf":true
            
         ]
      
   ]

请参阅this JsFiddle 了解完整的工作代码。

【讨论】:

以上是关于使用具有不同子字段的 JSON 加载 TreeStore的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 加载具有空值的 JSON 字段

Laravel 急切加载具有限制和自定义字段的子关系

带有 Laravel 的 Postgresql:使用子字符串过滤 Json 字段

将 json 字段绑定到 POJO 中具有不同名称的字段的注解

使用 Spark 访问嵌套在结构中的 json 数组

AWS Glue - Redshift 中具有 Json 结构的字段