无法解析本地 json

Posted

技术标签:

【中文标题】无法解析本地 json【英文标题】:Cannot parse local json 【发布时间】:2013-06-12 21:55:44 【问题描述】:

我刚开始使用 Sencha Touch 并正在开发 2.2.1 版本。出于某种原因,我无法让我的本地 json 正确解析。我知道这不是响应问题,因为我可以在我的 chrome 开发人员工具中看到 json。

这是我的store

Ext.define('MyApp.store.Tasks', 
    extend: 'Ext.data.Store',
    requires: [
        'MyApp.model.Task'
    ],

    config: 
        autoLoad: true,
        storeId: 'tasksStore',
        model: 'MyApp.model.Task',
        proxy: 
            type: 'ajax',
            url: 'tasks.json',
            reader: 
                type: 'json',
                            rootProperty: 'tasks'
            
        

    
);

这是我的Model

Ext.define('MyApp.model.Task', 
    extend: 'Ext.data.Model',

    config: 
        fields: [
             name: 'id', type: 'int' ,
             name: 'task', type: 'string', defaultValue: 'task' 
        ]
    
);

我正在使用Jasmine 来测试我的商店。这是我的规格

describe('MyApp.store.Tasks', function() 
  it('Number of tasks should be four', function() 
    var store = Ext.create('MyApp.store.Tasks');

    expect(store.getCount()).toBe(4);

  );
);

还有,这是我的示例 json 文件。和Sencha的index.html文件在同一个目录,也就是根目录。


   "tasks":[
      
         "task":"Some Product",
         "id":0
      ,
      
         "task":"Another Product",
         "id":1
      ,
      
         "task":"A third product",
         "id":2
      ,
      
         "task":"A fourth product",
         "id":3
      
   ]

是因为实例化问题吗?还是我在这里遗漏了一些关键部分?我尝试将 jsonp 用于代理类型,但它需要一个围绕响应的包装器,我不太知道该怎么做。我正在 Safari 和 Chrome 上进行测试,不幸的是,这两种浏览器的单元测试都失败了。

谢谢!

【问题讨论】:

【参考方案1】:

商店加载是异步的,因此您无法在创建它们后立即访问它们的数据。

要知道商店何时加载完毕,可以在商店的load event上收听:

var store = Ext.create('MyApp.store.Tasks');

// you cannot use the store's data yet
// expect(store.getCount()).toBe(4);

store.on('load', function(records, success) 
    if (success) 
        // here the store has been loaded
        expect(store.getCount()).toBe(4);
    
);

或者,您也可以将回调传递给load method:

var store = Ext.create('MyApp.store.Tasks', autoLoad: false);

store.load(
    callback: function(records, operation, success) 
        if (success) 
            // here the store has been loaded
            expect(store.getCount()).toBe(4);
        
    
);

现在,这意味着你也必须make your Jasmine test asynchronous:

describe('MyApp.store.Tasks', function() 
    it('Number of tasks should be four', function() 
        var result = null,
            store = Ext.create('MyApp.store.Tasks');

        store.on('load', function(store, records, success) 
            result = success;
        );

        // using jasmine async...
        waitsFor(function() 
            return result !== null;
        );

        // this functin will be executed when the one in waitsFor returns true
        runs(function() 
            expect(store.getCount()).toBe(4);
        );
    );
);

【讨论】:

很好的解释!谢谢!

以上是关于无法解析本地 json的主要内容,如果未能解决你的问题,请参考以下文章

mongoexport 错误:失败:解析失败 + 无法识别的字段“快照”

解析 JSON 数据时无法将字符串附加到数组

无法解析由 npm pack 制作的本地 npm 模块

解析 JSON 文件(本地存储),从而快速创建对象数组

Flutter 从本地化 JSON 文件解析数组

如何在 FutureBuilder 中解析从本地主机接收的 JSON 对象