【问题标题】:Json.NET - How to exclude properties from Serialization without access to classJson.NET - 如何在不访问类的情况下从序列化中排除属性
【发布时间】:2017-02-09 09:57:45
【问题描述】:

我正在尝试使用Json.NET 序列化一个类。这是我目前要做的。

public class AClass
{
    // I don't have access to BClass
    public BClass b;
}

AClass a = new AClass();
JsonConvert.SerializeObject(a);

我无权访问BClass。我想序列化我的AClass,但我不想序列化BClass 的所有属性,只序列化其中的一部分。

我该怎么做?

【问题讨论】:

标签: c# .net json json.net


【解决方案1】:

您可以使用自定义的ContractResolverthis library 会更容易构建。

var propertiesContractResolver = new PropertiesContractResolver();
propertiesContractResolver.ExcludeProperties.Add("BClass.Id");
var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = propertiesContractResolver;
JsonConvert.SerializeObject(a, serializerSettings);

【讨论】:

  • 您必须添加对 nuget 包的依赖才能不序列化字段?
  • 我认为这没有问题。如果您不喜欢 nuget,可以随时复制源代码或编写自己的源代码。
  • 这个 nuget 包非常有用,因为我对同一个对象有两种不同的序列化需求。不寻常,是的。这是完美的。效果也很好。
【解决方案2】:

想到了几个想法,您可以根据需要为多少不同的类执行此操作以及您需要算法的性能如何来选择它们:

可能最快的方法是使用 Json.net 的 custom convertersContract Resolvers 并构建一个适合您的需求,即忽略您不想要的属性包括在内。

另一种方法是将此类映射到另一个类似定义的类,该类根本不包含您不希望包含的属性,然后序列化该类。您可以使用 AutoMapper 在类似定义的类之间进行快速映射。

最后,您可以创建一个ExpandoObject(甚至是Dictionary<string, object>)并添加您想要包含在 Expando 或 Dictionary 中的属性(您可以手动或通过复制这些属性/键值对)反射等),然后序列化该对象/字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多