你好(对不起我的英语)
我正在开发使用Spring SPRING MVC的json前端网站消耗Web服务的Web服务。spring mvc使用JsonIdentityInfo选项进行序列化,因此每个对象仅在json中写入一次,并且每次都使用引用进行写入,例如她使用相同的对象“ component”有2个“ computer”,因此spring将ID设置为第一个组件(“ @componentID”:2),第二个组件的ID为(2):
[ { "@computerID": 1, "component": { "@componentID": 2, "processor": 2, "ram": "8g", "harddrive": "wd" } }, { "@computerID": 3, "component": 2 } ]
我想要的是 :
[ { "@computerID": 1, "owner" : "Mister B", "component": { "@componentID": 2, "processor": 2, "ram": "8g", "harddrive": "wd" } }, { "@computerID": 3, "owner" : "Mister A", "component": { "@componentID": 2, "processor": 2, "ram": "8g", "harddrive": "wd" } } ]
我搜索了很多执行此操作的代码,但没有找到任何想法。
我无法编辑Web服务以删除此行为。我可以使用javascript或jquery(或其他librairie)在客户端编辑json,以将引用替换为实际引用的对象吗?(数据实际上更加复杂和深入,我在对象中有3级子对象)。
非常感谢。
将所有数组成员拆分为新数组:具有完整component属性(不仅是数字)的成员和不具有完整属性的成员。循环遍历应该只具有数字component属性的其余原始成员,然后@componentID从“好”数组中查找对应的成员,并进行一些复制和移动。
component
@componentID
// initialize some vars var final = [], temp = [], bad = [], c = {}, computers = [ { "@computerID": 1, "component": { "@componentID": 2, "processor": 2, "ram": "8g", "harddrive": "wd" } }, { "@computerID": 3, "component": 2 } ]; // split original array into 3: final, bad, & temp while(computers.length > 0) { c = computers.pop(); if (c.hasOwnProperty("component")) { if (typeof c.component === "number") { temp.push(c); } else { final.push(c); } } else { bad.push(c); } } // loop through temp & look up @componentID within final while (temp.length > 0) { c = temp.pop(); // should @componentID be 1-of-a-kind? var found = getObjects(final, "@componentID", c.component); if (found.length) { c.component = found[0]; final.push(c); } else { bad.push(c); } } // SOURCE: http://stackoverflow.com/a/4992429/1072176 function getObjects(obj, key, val) { var objects = []; for (var i in obj) { if (!obj.hasOwnProperty(i)) continue; if (typeof obj[i] == 'object') { objects = objects.concat(getObjects(obj[i], key, val)); } else if (i == key && obj[key] == val) { objects.push(obj); } } return objects; } // should result in just one or two populated arrays: final and/or bad alert(JSON.stringify(final));
您会注意到,我实际上制作了三个数组,但最后只填充了两个:final拥有好的新对象,而另一个(bad)是对没有组件属性的对象或组件编号为对应的@componentID的对象的统称找不到。
final
bad