【问题标题】:Sencha touch2: How can i parse my nested json data?Sencha touch2:如何解析嵌套的 json 数据?
【发布时间】:2013-06-06 17:44:57
【问题描述】:

我无法解析我的嵌套 json 数据,我尝试了很多方法,但我无法成功。任何帮助表示赞赏。 这是我的 json 输出的样子:

[
  {
    "task": {
      "locator": "FGWESD",
      "subtask": [
        {
          "work": {
            "number": "1145",
            "id": "0",
            "status": true,
            "gate": "N\/A",
            },
          "sequenceNumber": "0",
          "id": "0"
        },
        {
          "work": {
            "number": "1145",
            "id": "0",
            "status": true,
            "gate": "N\/A",
          },
          "sequenceNumber": "0",
          "id": "0"
        }
      ],
      "connectTime": "0",
      "id": "0"
    }
  }
]

这是我的模型:

Ext.define('MyApp.model.MyModel',{
    extend:'Ext.data.Model',
    xtype:'myModel',
    config:{
        fields:[
        {name:'number',mapping:'work.number'},
        {name:'id',mapping:'work.id'},
        {name:'locator',mapping:'task.locator'},
        {name:'gate',mapping:'work.gate'}

        ]
    }
});

这里是商店:

Ext.define('MyApp.store.StoreList', {
    extend:'Ext.data.Store',
     config:{
        model:'MyApp.model.MyModel',
        storeId: 'id_Store',
// added the url dynamically inside the controller
        proxy:{
            type:'ajax',
            reader:
            {
                type:"json",
                rootProperty: 'subtask'
            },
            method: 'POST',
            actionMethods: {
                create : 'POST',
                read   : 'POST', // by default GET
                update : 'POST',
                destroy: 'POST'
            },
            headers :{
                "Content-Type" :'application/xml',
                'Accept':'application/json'
            }

        }
    }
});

这是我的控制器代码:

    Ext.define('MyApp.controller.LoginController', {
        extend: 'Ext.app.Controller',
        requires: ['Ext.data.proxy.Rest'],

        config: {
// My code is too long to add here so am adding store loading when user taps login button

},
  getDetails: function(){
        var segmentStore = Ext.create('MyApp.store.StoreList');
        var url = 'http://localhost:8080/apps';
        segmentStore.getProxy().setUrl(url.trim());
        segmentStore.load({
                   scope:this,
                    callback: function(records, operation, success){
                        if(success){
                           console.log('records: ',records);

                           console.log('records: '+records.length); // prints here 1
                          console.log('locator: '+records[0].getData().locator);
// prints FGWESD
                          console.log('locator: '+records[0].getData().number);
//prints undefined
// 
                        }
}
            }
        )
    },
});

谁能帮帮我。如何获取数字、门、ID 和状态的值? 必须对模型、存储和控制器进行哪些必要的更改? 请帮我解决?谢谢。

【问题讨论】:

  • 我认为你不能仅仅通过使用rootPropertymapping 来做到这一点。你有多个“任务”项目还是只有一个?
  • 只有一个“任务”。有什么帮助吗?
  • 你能重组你的 JSON 吗?
  • 没有。应该是一样的。
  • hmm,在这种情况下,我看到的唯一方法是使用 Ext.Ajax.request 从服务器获取数据,在回调中解析数据,然后使用 store.setData 和正确结构化的数据。不过,我很高兴听到更好的方法..

标签: json extjs sencha-touch sencha-touch-2


【解决方案1】:

正如我在评论中所写,如果不手动解析数据并将其加载到商店,我认为您无法实现这一目标。所以 getDetails 函数应该是这样的:

getDetails: function(){
    var segmentStore = Ext.create('MyApp.store.StoreList');
    Ext.Ajax.request({
        url: 'http://localhost:8080/apps',
        success: function(response){
            var responseObj = Ext.decode(response.responseText);
            var task = responseObj[0].task;
            var locator = task.locator;
            var subtasks = [];
            Ext.each(task.subtask, function(subtask) {
                subtasks.push({
                    number: subtask.work.number,
                    id: subtask.work.id,
                    gate: subtask.work.gate,
                    locator: locator
                });
            });
            segmentStore.setData(subtasks);
        }
    });
}

此外,使用此方法时,您应该从模型中删除映射,并且可以摆脱存储的代理定义。另外,我不确定你为什么要在“getDetails”中创建商店而不是在控制器的“商店”配置中定义它,但也许你有你的理由.. 我没有运行代码,所以可能会有错误,但我希望你明白。

【讨论】:

    【解决方案2】:

    我认为你商店的根属性应该是:

    rootProperty: 'task.subtask'
    

    【讨论】:

    • 注意他的数据的顶层是一个数组,而不是一个对象
    • 我已经按照您的建议使用了上述内容,但仍然收到相同的错误:未定义。有什么帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多