extJS:读取嵌套的JSON

时间:2011-04-09 07:47:44

标签: json extjs combobox ldap

我有一个来自ldap_search()调用的非常嵌套的JSON。我想用这些信息来填充ExtJS ComboBox,但是我遇到了一些与读者有关的麻烦。显然,我无法读取ComboBox中需要的信息,即人员的邮件地址,uid和cn

我认为整个问题在于商店。我正在尝试以下代码:

var store= new Ext.data.JsonStore({
        url:'search.php',   
        root: '',
        totalProperty: 'count',
        fields: [
            {name:'cn', type: 'string', mapping:'cn.0'},
            {name:'mail', type: 'string', mapping:'mail.0'},
            {name:'uid', type: 'string', mapping:'uid.0'}
        ]
});

但FireBug告诉我missing ; before statement return obj.cn.0 in ext-all.js (line 7)。我尝试了另一种更简单的JSON数组并且它可以工作,这就是为什么我真的认为问题在于这部分代码,特别是在映射中。

search.php返回的JSON示例是:

{
  "count": 2,
  "0": {
    "mail": {
      "count": 1,
      "0": "Mail address not registered."
    },
    "0": "mail",
    "uid": {
      "count": 1,
      "0": "name0.surname0@domain.com"
    },
    "1": "uid",
    "cn": {
      "count": 1,
      "0": "Surname0 Name0"
    },
    "2": "cn",
    "count": 3,
    "dn": "cn=Surname0 Name0,ou=personal,dc=domain,dc=com"
  },
  "1": {
    "mail": {
      "count": 1,
      "0": "name1.surname1@domain.com"
    },
    "0": "mail",
    "uid": {
      "count": 1,
      "0": "name1.surname1"
    },
    "1": "uid",
    "cn": {
      "count": 1,
      "0": "Surname 1 Name 1"
    },
    "2": "cn",
    "count": 3,
    "dn": "cn=Surname1 Name1,ou=personal,dc=domain,dc=com"
  }
}

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

是的,JSON结构无法直接使用标准的ExtJS JSONReader。看一下从ExtJS API documentation获取的关于JSON应该如何的示例。

{
    results: 2000, // Reader's configured totalProperty
    rows: [        // Reader's configured root
        // record data objects:
        { id: 1, firstname: 'Bill', occupation: 'Gardener' },
        { id: 2, firstname: 'Ben' , occupation: 'Horticulturalist' },
        ...
    ]
}

此外,root配置选项是必需的,您不能将其留空。在上面的示例中,您的root将是“行”。

您可能需要首先将您的JSON解析为更简单的格式,然后再将其提供给JSONReader。

答案 1 :(得分:1)

我当时想要做同样的事情,但其中一个嵌套项目是我的图表中的一个字段。这篇文章不断出现,所以我认为看看我做了什么来解决图表问题可能会有所帮助。解决问题的关键是知道标签配置存在:http://docs.sencha.com/ext-js/4-0/#!/api/Ext.chart.Label。使用它可以覆盖传入的默认渲染。在此示例中,字段为“key”(此处未显示,但我的模型使用“key”的默认类型(即,不是字符串))。密钥对象将传递给渲染器。使用函数(t),我现在可以像javascript一样访问该对象,并在对象下传回该名称。

 json
    key : { 
            wholePath : "c:/.../fileName.txt",
            fileName : "fileName.txt",
        }
  code:
    axes: [
    {
        title: 'Values',
        type: 'Numeric',
        position: 'left',
        fields: ['value'],
        minimum: 0,
        maximum: 100,
        minorTickSteps: 1
    },
    {
        title: 'File Name',
        type: 'Category',
        position: 'bottom',
        fields: ['key'],
        label: {
            renderer: function(t) {
               var fileName = t.name;
               return fileName;
            }
        }
    }