Разбор JSON в Extjs Store - PullRequest
       9

Разбор JSON в Extjs Store

0 голосов
/ 29 июля 2011

Я использую ExtJS4 для запроса данных в формате id-label ('id' - 'rdfs: label' в моем случае).

У меня сложная структура ответа JSON:

[
{
"@" : "msg:M_8CE1C07B1CFC469",
"a" : "msg:Message",
"msg:in-reply-to" : "msg:M4e32b0b7e37ae",
"msg:sender" : "pacahon",
"msg:reciever" : "Ennoia:DocumentTypesStore.listTemplates",
"msg:result" : [
    {
     "@" : "user_onto:881fc0a8-2912-4964-86c6-adad4a713eb8",
     "dc:creator" : "auth:user1",
     "dc:identifier" : "881fc0a8-2912-4964-86c6-adad4a713eb8",
     "rdfs:label" : "undefined|ru",
     "rdfs:subClassOf" : ["user_onto:881fc0a8-2912-4964-86c6-adad4a713eb8_v_1_f_0","user_onto:881fc0a8-2912-4964-86c6-adad4a713eb8_v_1_f_1","user_onto:881fc0a8-2912-4964-86c6-adad4a713eb8_v_1_f_2","user_onto:881fc0a8-2912-4964-86c6-adad4a713eb8_v_1_f_3","docs:Document"]
    },
    {
     "@" : "user_onto:ef54ecef-8e19-41ea-b1cc-2bc4ebb40877",
     "dc:creator" : "auth:user1",
     "dc:identifier" : "ef54ecef-8e19-41ea-b1cc-2bc4ebb40877",
     "rdfs:label" : "type1|ru",
     "rdfs:subClassOf" : ["user_onto:ef54ecef-8e19-41ea-b1cc-2bc4ebb40877_v_1_f_0","user_onto:ef54ecef-8e19-41ea-b1cc-2bc4ebb40877_v_1_f_1","user_onto:ef54ecef-8e19-41ea-b1cc-2bc4ebb40877_v_1_f_2","user_onto:ef54ecef-8e19-41ea-b1cc-2bc4ebb40877_v_1_f_3","docs:Document"]
    }],
"msg:status" : "ok",
"msg:reason" : "запрос выполнен: авторизованны все найденные субьекты :     2"
}
] 

Я хочу прочитать этот json в своем магазине и получить что-то вроде этого:

[{"@" : "user_onto:881fc0a8-2912-4964-86c6-adad4a713eb8"
  "rdfs:label" : "undefined|ru"},
 {"@" : "user_onto:ef54ecef-8e19-41ea-b1cc-2bc4ebb40877"
  "rdfs:label" : "type1|ru"}]

Обратите внимание, я не хочу изменять этот ответ JSON (удалить или добавить фигурные скобки).

1 Ответ

1 голос
/ 01 августа 2011

Я использовал API Doc для решения своей проблемы (Ext.data.reader.Reader):

        Ext.define("Response", {
                extend: 'Ext.data.Model',
                fields: [
                    {name:'id', type:'string', mapping:'@'}
                ],

                hasMany: {model: 'Message', name: 'messages', associationKey:'msg:result'},
            });

        Ext.define("Message", {
                extend: 'Ext.data.Model',
                fields: [{name:'id', type:'string', mapping:'@'}, {name:'title', type:'string', mapping:'rdfs:label'}],
                belongsTo: 'Response'
          });

Затем я добавляю Response как модель для моего JsonStore:

        proxy: {
                type: 'ajax',
                url: './controller.php?class=DocumentTypesStore&action=get&method=listTemplates',           
                method: "POST",
                actionMethods: {read: 'POST'},          
                reader: {
                    type: 'json',
                    root: [],
                            idProperty: '@'
                }
            }

И теперь я могу читать значения:

    jsonstore.on('load', function(){
        var response = jsonstore.first();
        console.log(response.get('id'));
        response.messages().each(function(message) {
            console.log(message.get('id'));
        });         
    });
...