是否有用于 JSON.Net 的 JavaScript 序列化程序



我正在使用Newtonsoft JSON.Net 在启用PreserveReferencesHandling的情况下反序列化对象。 jQuery不支持基于 JSON.Net 使用的$ref和$id语法重新链接引用(我不知道jQuery是否支持此功能)。

我尝试使用 Douglas Crockford 的循环.js但这似乎不适用于我的对象,返回的对象与传入的对象相同。

我对 JSON.Net 不是很熟悉,但我似乎找不到任何可以序列化(或解析)JSON其.NET组件输出的javascript库。

如何完成将对象引用重新组合在一起?

我也

在寻找这个问题的解决方案,最终破解了Douglas Crockford的JSON.retrocycle函数。他的函数不适用于 $ref=某个数字,但它会寻找类似 xpath 的东西。

这是我的快速和肮脏的版本 - 不要按原样使用它 - 我没有做任何清理,它可能应该是一个插件,但它可以完成工作并且足够好:

function retrocycle(o) {
var self = this;
self.identifiers = [];
self.refs = [];
self.rez = function (value) {
    // The rez function walks recursively through the object looking for $ref
    // properties. When it finds one that has a value that is a path, then it
    // replaces the $ref object with a reference to the value that is found by
    // the path.
    var i, item, name, path;
    if (value && typeof value === 'object') {
        if (Object.prototype.toString.apply(value) === '[object Array]') {
            for (i = 0; i < value.length; i += 1) {
                item = value[i];
                if (item && typeof item === 'object') {
                    path = item.$ref;
                    if (typeof path === 'string' && path != null) {
                        //self.refs[parseInt(path)] = {};
                        value[i] = self.identifiers[parseInt(path)]
                    } else {
                        self.identifiers[parseInt(item.$id)] = item;
                        self.rez(item);
                    }
                }
            }
        } else {
            for (name in value) {
                if (typeof value[name] === 'object') {
                    item = value[name];
                    if (item) {
                        path = item.$ref;
                        if (typeof path === 'string' && path != null) {
                            //self.refs[parseInt(path)] = {};
                            value[name] = self.identifiers[parseInt(path)]
                        } else {
                            self.identifiers[parseInt(item.$id)] = item;
                            self.rez(item);
                        }
                    }
                }
            }
        }
    }
};
self.rez(o);
self.identifiers = [];
}

像这样使用它:

    $.post("url/function", { ID: params.ID }, function (data) {
        retrocycle(data)
        // data references should be fixed up now
    }, "json");
你必须在

js解析器中写入双重查找。从技术上讲,保留引用处理是为了绕过循环引用,也就是说,在解析过程中通常会导致堆栈溢出的原因。

JSON 没有用于处理此问题的本机语法。Newtonsoft版本是一个自定义实现,因此解析JSON将是一个自定义实现。

如果确实必须保留此类引用,则 XML 可能是更好的解决方案。那里有一些json->xml库。

这里有一个可能有用的解析解决方案,或者至少是一个指南:https://blogs.oracle.com/sundararajan/entry/a_convention_for_circular_reference

这是我

@Dimitri的增强版本。 @Dimitri代码有时无法重建引用。如果有人改进了代码,请告诉我。

问候马可·阿尔维斯。

if (typeof JSON.retrocycle !== 'function') {
    JSON.retrocycle = function retrocycle(o) {
        //debugger;
        var self = this;
        self.identifiers = [];
        self.refs = [];
        self.buildIdentifiers = function (value) {
            //debugger;
            if (!value || typeof value !== 'object') {
                return;
            }
            var item;
            if (Object.prototype.toString.apply(value) === '[object Array]') {
                for (var i = 0; i < value.length; i += 1) {
                    item = value[i];
                    if (!item || !item.$id || isNaN(item.$id)) {
                        if (item) {
                            self.buildIdentifiers(item);
                        }
                        continue;
                    }
                    self.identifiers[parseInt(item.$id)] = item;
                    self.buildIdentifiers(item);
                }
                return;
            }
            for (var name in value) {
                if (typeof value[name] !== 'object') {
                    continue;
                }
                item = value[name];
                if (!item || !item.$id || isNaN(item.$id)) {
                    if (item) {
                        self.buildIdentifiers(item);
                    }
                    continue;
                }
                self.identifiers[parseInt(item.$id)] = item;
                self.buildIdentifiers(item);
            }
        };
        self.rez = function (value) {
            // The rez function walks recursively through the object looking for $ref
            // properties. When it finds one that has a value that is a path, then it
            // replaces the $ref object with a reference to the value that is found by
            // the path.
            var i, item, name, path;
            if (value && typeof value === 'object') {
                if (Object.prototype.toString.apply(value) === '[object Array]') {
                    for (i = 0; i < value.length; i += 1) {
                        item = value[i];
                        if (item && typeof item === 'object') {
                            if (item.$ref)
                                path = item.$ref;
                            if (typeof path === 'string' && path != null) {
                                //self.refs[parseInt(path)] = {};
                                value[i] = self.identifiers[parseInt(path)];
                                continue;
                            }
                            //self.identifiers[parseInt(item.$id)] = item;
                            self.rez(item);
                        }
                    }
                } else {
                    for (name in value) {
                        if (typeof value[name] === 'object') {
                            item = value[name];
                            if (item) {
                                path = item.$ref;
                                if (typeof path === 'string' && path != null) {
                                    //self.refs[parseInt(path)] = {};
                                    value[name] = self.identifiers[parseInt(path)];
                                    continue;
                                }
                                //self.identifiers[parseInt(item.$id)] = item;
                                self.rez(item);
                            }
                        }
                    }
                }
            }
        };
        self.buildIdentifiers(o);
        self.rez(o);
        self.identifiers = []; // Clears the array
    };
}

相关内容

  • 没有找到相关文章

最新更新