栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用JavaScript反序列化SignalR / Json.NET中复杂对象图中的引用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用JavaScript反序列化SignalR / Json.NET中复杂对象图中的引用

好吧,我认为这可以做到。我修改了Crockford的cycle.js以处理Json.NET使用的参考格式。而且因为Typescript是一种比Javascript更好的语言,所以我在TS中重写了它。我当然不发誓它没有错误(如果有人指出了它们,我会尝试修复它们),但是它似乎可以处理到目前为止我扔给它的复杂对象图。

export function retrocycle(obj: any): void {    var catalog: any[] = [];    catalogObject(obj, catalog);    resolveReferences(obj, catalog);}function catalogObject(obj, catalog: any[]):void {    // The catalogObject function walks recursively through an object graph    // looking for $id properties. When it finds an object with that property, then    // it adds it to the catalog under that key.    var i: number;    if (obj && typeof obj === 'object') {        var id:string = obj.$id;        if (typeof id === 'string') { catalog[id] = obj;        }        if (Object.prototype.toString.apply(obj) === '[object Array]') { for (i = 0; i < obj.length; i += 1) {     catalogObject(obj[i], catalog); }        } else { for (name in obj) {     if (typeof obj[name] === 'object') {         catalogObject(obj[name], catalog);     } }        }    }}function resolveReferences(obj: any, catalog: any[]) {    // The resolveReferences function walks recursively through the object looking for $ref    // properties. When it finds one that has a value that is an id, then it    // replaces the $ref object with a reference to the object that is found in the catalog under    // that id.    var i:number, item:any, name:string, id:string;    if (obj && typeof obj === 'object') {        if (Object.prototype.toString.apply(obj) === '[object Array]') { for (i = 0; i < obj.length; i += 1) {     item = obj[i];     if (item && typeof item === 'object') {         id = item.$ref;         if (typeof id === 'string') {  obj[i] = catalog[id];         } else {  resolveReferences(item, catalog);         }     } }        } else { for (name in obj) {     if (typeof obj[name] === 'object') {         item = obj[name];         if (item) {  id = item.$ref;  if (typeof id === 'string') {      obj[name] = catalog[id];  } else {      resolveReferences(item, catalog);  }         }     } }        }    }}

和等效的JS:

function retrocycle(obj) {    var catalog = [];    catalogObject(obj, catalog);    resolveReferences(obj, catalog);}function catalogObject(obj, catalog) {    var i;    if (obj && typeof obj === 'object') {        var id = obj.$id;        if (typeof id === 'string') { catalog[id] = obj;        }        if (Object.prototype.toString.apply(obj) === '[object Array]') { for (i = 0; i < obj.length; i += 1) {     catalogObject(obj[i], catalog); }        } else { for (name in obj) {     if (typeof obj[name] === 'object') {         catalogObject(obj[name], catalog);     } }        }    }}function resolveReferences(obj, catalog) {    var i, item, name, id;    if (obj && typeof obj === 'object') {        if (Object.prototype.toString.apply(obj) === '[object Array]') { for (i = 0; i < obj.length; i += 1) {     item = obj[i];     if (item && typeof item === 'object') {         id = item.$ref;         if (typeof id === 'string') {  obj[i] = catalog[id];         } else {  resolveReferences(item, catalog);         }     } }        } else { for (name in obj) {     if (typeof obj[name] === 'object') {         item = obj[name];         if (item) {  id = item.$ref;  if (typeof id === 'string') {      obj[name] = catalog[id];  } else {      resolveReferences(item, catalog);  }         }     } }        }    }}

您可以像这样使用它(假设您已连接SignalR集线器):

$.connection.roomHub.server.joinRoom()    .done(function(room) {        retrocycle(room);    });

我还为此在BitBucket上创建了一个快速且肮脏的小存储库:
https://bitbucket.org/smithkl42/jsonnetdecycle。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398174.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号