Reputation: 18980
What is the easiest way to convert JSON A to JSON B using JavaScript?
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"}
]
}
===================
I didn't provide this in my question about what I'm using for a JavaScript framework, but it turns out you can implicitly eliminate the "d" key by specifying the value "d" in the root property
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'
}
})
});
Proxy:
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;
}
});
Combo Box (dropdown) configuration:
{
xtype: 'combo',
fieldLabel: 'Status',
emptyText: 'Select a status...',
store: statusDropdownStore,
valueField: 'key',
displayField: 'value',
mode: 'remote', // or 'local'
renderTo: document.body
},
Upvotes: 4
Views: 2735
Reputation: 1507
try this :) 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"}]}
Upvotes: 1
Reputation: 51937
I think this would do it:
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
I also this JsonB shouldn't be an object that contains an array of objects; I think it should just be an array of objects like this:
[
{"key":"1", "value":"one"},
{"key":"2", "value":"two"},
{"key":"3", "value":"three"}
]
Upvotes: 1
Reputation: 3780
Here's a sample
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;
}
Upvotes: 2
Reputation: 156
You could try the solution outlined at https://stackoverflow.com/a/1219633/832457 - using delete
to remove the key.
Try looping through the array and using delete
, then rename the array (by creating a new attribute and the deleting the old one
Upvotes: 1