是否存在现有的JavaScript库,该库将通过引用循环处理反序列化Json.Net?
{ "$id": "1", "AppViewColumns": [ { "$id": "2", "AppView": {"$ref":"1"}, "ColumnID": 1, } ] }
这应该反序列化为一个对象,该对象在数组中的对象和外部对象之间具有引用循环
好的,所以我创建了一个更健壮的方法,该方法将使用$ id和$ ref,因为这实际上是json.net处理循环引用的方式。另外,您还必须在注册ID后获取引用,否则它将找不到被引用的对象,因此我还必须保留请求引用的对象以及它们要设置的属性和ID。他们正在要求。
这是基于lodash /下划线的
(function (factory) { 'use strict'; if (typeof define === 'function' && define.amd) { define(['lodash'], factory); } else { factory(_); } })(function (_) { var opts = { refProp: '$ref', idProp: '$id', clone: true }; _.mixin({ relink: function (obj, optsParam) { var options = optsParam !== undefined ? optsParam : {}; _.defaults(options, _.relink.prototype.opts); obj = options.clone ? _.clone(obj, true) : obj; var ids = {}; var refs = []; function rl(s) { // we care naught about primitives if (!_.isObject(s)) { return s; } if (s[options.refProp]) { return null; } if (s[options.idProp] === 0 || s[options.idProp]) { ids[s[options.idProp]] = s; } delete s[options.idProp]; _(s).pairs().each(function (pair) { if (pair[1]) { s[pair[0]] = rl(pair[1]); if (s[pair[0]] === null) { if (pair[1][options.refProp] !== undefined) { refs.push({ 'parent': s, 'prop': pair[0], 'ref': pair[1][options.refProp] }); } } } }); return s; } var partialLink = rl(obj); _(refs).each(function (recordedRef) { recordedRef['parent'][recordedRef['prop']] = ids[recordedRef['ref']] || {}; }); return partialLink; }, resolve: function (obj, optsParam) { var options = optsParam !== undefined ? optsParam : {}; _.defaults(options, _.resolve.prototype.opts); obj = options.clone ? _.clone(obj, true) : obj; var objs = [{}]; function rs(s) { // we care naught about primitives if (!_.isObject(s)) { return s; } var replacementObj = {}; if (objs.indexOf(s) != -1) { replacementObj[options.refProp] = objs.indexOf(s); return replacementObj; } objs.push(s); s[options.idProp] = objs.indexOf(s); _(s).pairs().each(function (pair) { s[pair[0]] = rs(pair[1]); }); return s; } return rs(obj); } }); _(_.resolve.prototype).assign({ opts: opts }); _(_.relink.prototype).assign({ opts: opts }); });
我在这里创建了要点