当前位置: 首页 > 面试题库 >

如何从Json.NET序列化的JSON恢复循环引用(例如“ $ id”)?

常雪风
2023-03-14
问题内容

是否存在现有的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 });
});

我在这里创建了要点



 类似资料:
  • 问题内容: 有岗位这里,询问如何通过返回EF4CTP5序列化对象时,解决循环引用错误。不久前,我在WCF Web表单项目中遇到了同样的问题。 我能够在WCF / Web窗体项目和MVC3项目中“解决”此问题。我认为什么类型的项目都不重要,因为这似乎是EF序列化的“事物”。 我通过在ObjectContext构造函数中禁用ProxyCreation来解决此问题,如下所示: 我的问题是:有人可以解释为

  • 问题内容: 我有一个C#列表,看起来像这样: 我使用以下代码将JSON转换/序列化为(Newtonsoft.JSON): 使用上面的代码,我得到一个像这样的json字符串: 但是,这就是我需要得到的:由于我正在使用把手模板- 如何使用序列化器如上所述命名JSON数组? 问题答案: 用:

  • 问题内容: 我正在使用以下类型定义Json.NET属性,然后在其方法内部使用Json.NET对其进行序列化: 我的问题是,它将返回“ {}”。这是为什么?以前在工作。我所做的唯一更改是更改了OptIn而不是OptOut,因为我希望包含的属性少于保留的属性。 问题答案: 如Newtonsoft在本期中所述,Json.NET实际上支持属性。但是,当相应的“真实”成员是属性时,似乎Json.NET要求成

  • 问题内容: 我很好奇序列化和反序列化的方式。我使用关键字“ json”和“ tuple”进行搜索,但找不到所需的内容。 问题答案: 我通过和Json.net进行测试,测试代码如下。结果显示可序列化和可反序列化。因此,我可以在应用程序中使用它们。 测试代码 注释 在将序列化到字符串{“项目1”:“一”,“项目2”:“嘻嘻”,“项目3”:真正},并且它可以被反序列化回类型。

  • 我有一个数据结构藏书集,里面有一套书。每本书都有它所在藏书的参考文献。这是一种标准的一对多关系。它在服务器端工作得很好,但是我必须把它发送到客户端。该应用程序使用Jackson ObjectMapper进行序列化,设置为Spring Bean。问题是,您不能简单地序列化一个图书集合和书籍,因为标准JSON中没有引用(我确实需要标准JSON)。 当前的解决方案是把@JsonIgnore放在Book.

  • 问题内容: 我有一个带有JSON数组的有效JSON对象。JSON数组没有花括号,并且包含逗号分隔的混合类型列表。看起来像这样: 我创建了一个反映JSON结构的类,为复杂数组提供了一个List: 我也用列表列表进行了测试: 子模型如下所示: 在我的program.cs文件中,我正在反序列化如下: 当我运行该程序时,子对象(Rows)始终为。我究竟做错了什么? 问题答案: Json.Net没有将数组自