Json.NET - 如何在没有访问类的情况下排除序列化属性

4

我正在尝试使用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的所有属性,只想序列化其中的一些属性。

我应该如何做?


1
请查看此问题的已接受答案:https://dev59.com/AGYr5IYBdhLWcg3wi63d - Peter Bons
2个回答

9

您可以使用自定义的ContractResolver这个库可以使构建过程更加简单。

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

1
你必须添加一个NuGet包的依赖,只是为了不序列化一个字段吗? - Bidou
我认为这没有问题。如果你不喜欢NuGet,你可以随时复制源代码或自己编写。 - Alek Davis
这个NuGet包非常有用,因为我对同一对象有两个不同的序列化需求。虽然这很不寻常,但它非常完美。而且它也运行得很好。 - Bill Noel

1
有几个想法可以选择,取决于需要为多少不同的类执行此操作以及您需要算法的性能如何:
可能最快的方法是使用Json.net的自定义转换器合同解析器,并构建适合您需求的转换器,即忽略您不想包含的属性。
另一种方法是将此类映射到另一个定义类似但不包含您不想包含的属性的类中,然后将该类序列化。您可以使用AutoMapper快速映射类之间的相似处。
最后,您可以创建一个ExpandoObject(甚至是Dictionary<string,object>),并将要包含的属性添加到Expando或字典中(您可以手动复制这些属性/键值对,也可以通过反映等方式),然后将对象/字典序列化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接