Javascript 将动态JSON数据嵌套到Extjs模型

Javascript 将动态JSON数据嵌套到Extjs模型,javascript,json,extjs,extjs4,extjs4.2,Javascript,Json,Extjs,Extjs4,Extjs4.2,我想将此json转换为Extjs模型: { "TableHour": { "0": { "Rx": 0, "Tx": 0 }, "1": { "Rx": 2, "Tx": 0 }, "2": { "Rx": 0, "Tx": 0 }, "3": { "Rx": 6, "Tx": 0 } } } 我试过: Ext.define("

我想将此json转换为Extjs模型:

{
  "TableHour": {
    "0": {
      "Rx": 0,
      "Tx": 0
    },
    "1": {
      "Rx": 2,
      "Tx": 0
    },
    "2": {
      "Rx": 0,
      "Tx": 0
    },
    "3": {
      "Rx": 6,
      "Tx": 0
    }
  }
}
我试过:

Ext.define("TableHour", {
            extend: 'Ext.data.Model',
        hasMany:  { model:'TableMode' }
    });

    Ext.define("TableMode", {
        extend: 'Ext.data.Model',
        fields: [
        'Rx','Tx'
        ],          
        belongsTo: 'TableHour',
    });     

    var store1 = Ext.create('Ext.data.JsonStore',{
        autoLoad: true,
        model:'TableHour',
        proxy:{
            type:'ajax',
            url:'HoursReports.json',
            reader:{
                type: 'json',
            }
        }

    });   
    console.log(store1.getAt(0));
但最后一行,打印“未定义”。模型定义肯定是错误的。
数字“0”“1”“2”“3”未在我的模型中声明,因为它们是动态生成的。。。怎么办?

您的JSON数据似乎包含一个具有数字属性的对象作为集合。为了使用ExtJS,这应该是一个数组:

{
  "TableHour": [
    {
      "Rx": 0,
      "Tx": 0
    },{
      "Rx": 2,
      "Tx": 0
    },{
      "Rx": 0,
      "Tx": 0
    },{
      "Rx": 6,
      "Tx": 0
    }
  ]
}
现在,如果您想使用存储,那么
TableHour
应该是数据根,并且应该只有一个模型“TableMode”:


查看一个工作示例。

您可以使用Ext.Ajax.request()加载数据,并在成功回调中转换数据,使其具有所需的格式,而不是使用其load()方法自动加载存储。然后你可以把它放进你的商店

数据必须如下所示:

{
  "TableHour": [
    {
      "Id": 0,
      "Rx": 0,
      "Tx": 0
    },{
      "Id": 1,
      "Rx": 2,
      "Tx": 0
    },{

我已经修改了后端生成的Json。现在我的json是:

{
  "Date": null,
  "TableHourDto": [
    {
      "Hour": "0",
      "Rx": 3,
      "Tx": 5
    },
    {
      "Hour": "1",
      "Rx": 2,
      "Tx": 0
    },
    {
      "Hour": "2",
      "Rx": 0,
      "Tx": 0
    },
    {
      "Hour": "3",
      "Rx": 5,
      "Tx": 0
    }
}
我的Extjs模型是:

Ext.define("TableHour", {
                extend: 'Ext.data.Model',       
                fields: [
                'Hour','Rx','Tx'
                ],
            });
我的商店:

var store1 = Ext.create('Ext.data.JsonStore',{
                autoLoad:true,
                proxy:{
                    type:'ajax',
                    url:'HoursReports.json',                    
                    reader:{
                        type: 'json',
                        model:'TableHour',
                        root: 'TableHourDto',
                        listeners : {
                            exception: function( reader, response, error, eOpts ){
                                console.log('Got exception');
                            }
                        }
                    }                   
                },
                listeners:{
                    load:function( store, records, successful, eOpts ){
                        console.log(store.getAt(0).data);
                        // This print first: Object {Hour: "0", Rx: 3, Tx: 5}
                    }
                }
            }); 
有了这个商店,我将建立相关图表。。。
谢谢大家的回复

谢谢大家的回复,但如果我还想查看“0”“1”“2”。(与我最初的示例相同)我该怎么办?@matt是正确的,这只是数据建模中的一个错误。模型不应具有N个以整数作为属性名称的动态属性。这更好地建模为一个对象数组,每个对象都有自己的属性
[{id:0,Rx:0,Tx:0},{id:1,Rx:2,Tx:0},{id:2,Rx:0,Tx:0},{id:3,Rx:6,Tx:0}]
。这些数字是如何生成的?它是在JS中完成的还是在后端某处完成的?它是在.net framework中完成的,我使用sortedList对象生成一个对象,JsonNet打印json对象格式。将数据传递到Extjs以生成图表是正确的选择吗?现在我在后端生成它。如何在Extjs存储中重新呈现它?我很困惑(特别是与hasOne关联),我没有关联的经验。我很难让它们工作,最后我不需要它们了。
var store1 = Ext.create('Ext.data.JsonStore',{
                autoLoad:true,
                proxy:{
                    type:'ajax',
                    url:'HoursReports.json',                    
                    reader:{
                        type: 'json',
                        model:'TableHour',
                        root: 'TableHourDto',
                        listeners : {
                            exception: function( reader, response, error, eOpts ){
                                console.log('Got exception');
                            }
                        }
                    }                   
                },
                listeners:{
                    load:function( store, records, successful, eOpts ){
                        console.log(store.getAt(0).data);
                        // This print first: Object {Hour: "0", Rx: 3, Tx: 5}
                    }
                }
            });