Ext JS 4:使用 JavaScript 将 JSON 对象转换为另一个 JSON 对象

Posted

技术标签:

【中文标题】Ext JS 4:使用 JavaScript 将 JSON 对象转换为另一个 JSON 对象【英文标题】:Ext JS 4: Convert JSON object to another JSON object using JavaScript 【发布时间】:2012-07-30 12:21:03 【问题描述】:

使用 javascript 将 JSON A 转换为 JSON B 的最简单方法是什么?

JSON A:


    "d":
    [
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"0","value":"one",
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"1","value":"two",
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"2","value":"three"
    ]

JSON B:


    data:
    [
        "key":"1", "value":"one",
        "key":"2", "value":"two",
        "key":"3", "value":"three"
    ]
    

====================

8/1/2012 更新(使用 Ext JS 并且您有 ASP.NET 代理时回答:

我没有在关于我为 JavaScript 框架使用什么的问题中提供这一点,但事实证明,您可以通过在根属性中指定值“d”来隐式消除“d”键

var statusDropdownStore = new Ext.data.Store(
    proxy: new Ext.ux.AspWebAjaxProxy(
        url: '/track/Controls/Shared/GeneralService.asmx/GetDropdownOptions',
        actionMethods: 
            create: 'POST',
            destroy: 'DELETE',
            read: 'POST',
            update: 'POST'
        ,
        extraParams: 
            user_login: authUser,
            table_name: '[status]'
        ,
        reader: 
            type: 'json',
            model: 'DropdownOption',
            root: 'd'
        ,
        headers: 
            'Content-Type': 'application/json; charset=utf-8'
        
    )
);

代理:

Ext.define('Ext.ux.AspWebAjaxProxy', 
    extend: 'Ext.data.proxy.Ajax',
    require: 'Ext.data',

    buildRequest: function (operation) 
        var params = Ext.applyIf(operation.params || , this.extraParams || ),
                                request;
        params = Ext.applyIf(params, this.getParams(params, operation));
        if (operation.id && !params.id) 
            params.id = operation.id;
        

        params = Ext.JSON.encode(params);

        request = Ext.create('Ext.data.Request', 
            params: params,
            action: operation.action,
            records: operation.records,
            operation: operation,
            url: operation.url
        );
        request.url = this.buildUrl(request);
        operation.request = request;
        return request;
    
);

组合框(下拉)配置:

                    
                        xtype: 'combo',
                        fieldLabel: 'Status',
                        emptyText: 'Select a status...',
                        store: statusDropdownStore,
                        valueField: 'key',
                        displayField: 'value',
                        mode: 'remote',  // or 'local'
                        renderTo: document.body
                    ,

【问题讨论】:

【参考方案1】:

这是一个示例

var old = 
    "d":
    [
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"0","value":"one",
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"1","value":"two",
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"2","value":"three"
    ]
;

old.data = old.d;
delete old.d;
for(var i=0,l=old.data.length;i<l;i++)
    delete old.data[i].__type;

【讨论】:

【参考方案2】:

我认为这样做可以:

var TheJsonA = JSON.parse(JsonA);
TheJsonA = TheJsonA.d;

var TheJsonB = ;
TheJsonB.data = [];
var TheObject = ;

if (TheJsonA.length > 0)  

  for (var i = 0, LoopTimes = TheJsonA.length; i < LoopTimes; i++) 
      TheObject = ;
      TheObject.key = TheJsonA[i].key;
      TheObject.value = TheJsonA[i].value;
      TheJsonB.data.push(TheObject);
  


TheJsonA = null; // if you need to discard the initial object

我也这个 JsonB 不应该是一个包含对象数组的对象;我认为它应该只是一个这样的对象数组:

[
     "key":"1", "value":"one",
     "key":"2", "value":"two",
     "key":"3", "value":"three"
]  

【讨论】:

您只将数组作为对象是完全正确的!关于 ExtJS 如何允许您删除“d”属性,请参阅我的问题的底部。我猜“__type”属性会保留在那里。因为我们在组合配置中明确声明了“key”和“value”,所以不会造成任何伤害。 "key" 是 valueField 值属性,"value" 是 displayField 值 是的,您可以使用 ExtJS 从包装对象中提取数组,但这是重炮!第二行代码通过将 .d 中的元素重新分配给包装对象本身来实现:TheNewObject = TheNewObject.d;快乐编码! 你曾经在克利尔沃特海滩的法国人吃过饭吗? (靠近坦帕/圣彼得堡)美食! 没有,但是你在法国巴黎吃过饭吗?【参考方案3】:

您可以尝试https://***.com/a/1219633/832457 中列出的解决方案 - 使用 delete 删除密钥。

尝试遍历数组并使用delete,然后重命名数组(通过创建新属性并删除旧属性

【讨论】:

【参考方案4】:

试试这个:) http://jsfiddle.net/daewon/LnpXb/

var jsonA = 
    d: [
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"0","value":"one",
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"1","value":"two",
        "__type":"Web.Controls.Shared.GeneralService+DropdownKeyValuePair","key":"2","value":"three"
   ]
;

var jsonB = 
    data: []
;

var d = jsonA.d;
for (var i=0; i<​d.length​; i++)
    var obj = 
        key : d[i].key,
        value : d[i].value
    ;

    jsonB.data.push(obj);    

console.log(JSON.stringify(jsonB));
=> "data":["key":"0","value":"one","key":"1","value":"two","key":"2","value":"three"] 

【讨论】:

以上是关于Ext JS 4:使用 JavaScript 将 JSON 对象转换为另一个 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序启动时预加载 Ext JS 和自定义 JavaScript 文件

EXT JS

使用 Ext JS 版本 4.2.1 读取 URL 中的查询参数

如何将 Ext 3 和 Ext 4 与 GeoExt 一起使用?

javascript Ext.js

JavaScript ext js BorderLayout