gpt4 book ai didi

c# - JSON.NET - 在运行时排除特定类型的属性

转载 作者:太空狗 更新时间:2023-10-29 20:25:29 25 4
gpt4 key购买 nike

我想知道如何使用 Json.NET 库排除/剥离给定类型(或这些类型的集合)的某些属性进行序列化?我尝试编写自己的契约(Contract)解析器(继承自 DefaultContractResolver),但没有成功。

我知道我可以使用 DataAnnotations 来完成,用 ScriptIgnoreAttribute 装饰排除的属性,但它不适用我的场景。序列化的对象几乎可以是任何东西,所以我不知道在设计时要排除哪些属性。我只知道不应序列化的属性的类型

这看起来是一个相当简单的任务,但不幸的是我在任何地方都找不到合适的解决方案......

顺便说一句 - 我不受 Json.NET 库的约束 - 如果可以使用默认/其他 .NET JSON 序列化程序轻松完成,这对我来说也是一个同样好的解决方案.

更新

在尝试序列化之前必须排除这些属性。为什么?

基本上,我接收和序列化的对象类型可以具有继承自 IDynamicMetaObjectProvider 类型的动态属性。我不打算描述所有细节,但是从这些对象的 GetMetaObject 方法返回的 DynamicMetaObject 没有 DynamicMetaObject.GetDynamicMemberNames 方法已实现(抛出 NotImplementedException...)。 总结 - 问题是那些对象(我需要排除)不允许枚举它们的属性,这是 Json.NET 序列化程序试图在幕后做的事情。我总是以 NotImplementedException 被抛出而告终。

最佳答案

我已经尝试了 WCF JSON 序列化以及 System.Web.Script.Serialization.JavaScriptSerializer .我发现,如果您想要对序列化过程进行可靠的控制,并且不想受属性和 hack 的束缚来使事情正常进行,JavaScriptSerializer 是您的不二之选。它包含在 .NET 堆栈中,允许您创建和注册 JavaScriptConverter 子类以执行类型的自定义序列化。

我发现的唯一可能给您带来问题的限制是您无法轻松地注册一个转换器来转换 Object 的所有子类(也就是一个转换器来统治它们)。您确实需要了解公共(public)基类或通过扫描程序集预先注册类型集。但是,属性序列化完全由您决定,因此您可以使用简单的反射来决定序列化哪些属性以及如何序列化。

另外,JSON 的默认序列化比 WCF 方法要好得多。默认情况下,所有类型都可以在没有属性的情况下进行序列化,枚举按名称序列化,字符串键字典序列化为 JSON 对象,列表序列化为数组等。但是由于明显的原因,例如循环树,即使是默认行为也时常需要帮助时间。

在我的例子中,我支持的客户端 API 与服务器类结构不完全匹配,我们想要一种更简单的 JSON 语法,看起来很容易,JavaScriptSerializer 做到了每次都是这个把戏。如果您需要一些代码示例才能开始,请告诉我。

关于c# - JSON.NET - 在运行时排除特定类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com