Sencha Touch 2:将非标准JSON加载到商店中

时间:2014-04-15 09:37:21

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

Sencha Touch网络应用程序从REST Web服务提交的JSON加载商店。对于其他技术要求,JSON不是标准的(但仍然有效)并遵循以下模式:

{
    "101": {
        "id": "101",
        "title": "title 101",
        "description": "description 101",
        "order": "20",
        "thumb": {
            "id": "10101",
            "uri": "http://linktothumb.jpg"
        },
        "parent": "0",
        "cType": "5"
    },
    "102": {
        "id": "102",
        "title": "title 102",
        "description": "description 102",
        "order": "59",
        "thumb": {
            "id": "10102",
            "uri": "http://linktothumb.jpg"
        },
        "parent": "101",
        "cType": "5"
    }
}

不幸的是,当我执行myStore.load()时,ST无法解析JSON,并且数据未添加到商店。但是如果JSON响应遵循以下模式,它将起作用:

 [
    {
        "id": "101",
        "title": "title 101",
        "description": "description 101"
        "thumb": {
            "id": "10101",
            "uri": "http://linktothumb.jpg"
        },
        "parent": "0"
    },
    {
        "id": "102",
        "title": "title 102",
        "description": "description 102"
        "thumb": {
            "id": "10102",
            "uri": "http://linktothumb.jpg"
        },
        "parent": "101"
    }
]

我无法更改JSON的格式,因此我需要找到一种方法来使其与此响应一起使用。是否可以将参数添加到ST的JSON阅读器中,还是可以手动解析JSON响应?如果是,怎么样?

这是我商店的代理:

proxy: {
    type:'rest',
    useDefaultXhrHeader : false,
    headers: {
        'Accept': 'application/json'
    },
    reader: {
        type:'json'
    }
}

1 个答案:

答案 0 :(得分:1)

您可以创建自定义阅读器:

Ext.define("App.data.reader.MyReader", {
    extend: 'Ext.data.reader.Json',
    getResponseData: function(response) {
        var data, error;

        try {
            data = this.parseResponse(Ext.decode(response.responseText));             
            return this.readRecords(data)
        } catch (ex) {
            error = new Ext.data.ResultSet({
                total  : 0,
                count  : 0,
                records: [],
                success: false,
                message: ex.message
            });

            this.fireEvent('exception', this, response, error);
            Ext.Logger.warn('Unable to parse the JSON returned by the server');
            return error;
        }
    },
    parseResponse: function(data) {
        return data; 
    }
});

通过自定义parseResponse,您可以按照自己的方式处理数据。