Json.net仅序列化某些属性

编程入门 行业动态 更新时间:2024-10-28 02:35:57
本文介绍了Json仅序列化某些属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

Json可以通过任何方式仅指定要序列化的属性吗?还是基于绑定标志(例如仅声明的)序列化某些属性?

Does Json have any way to specify only the properties you want to be serialized? or alternatively serialize certain properties based on binding flags like Declared Only?

现在我正在使用JObject.FromObject(MainObj.SubObj);来获取SubObj的所有属性,SubObj是遵循ISubObject接口的类的实例:

Right now I am using JObject.FromObject(MainObj.SubObj); to get all properties of SubObj which is an instance of a class that obeys the ISubObject interface:

public interface ISubObject { } public class ParentSubObject : ISubObject { public string A { get; set; } } public class SubObjectWithOnlyDeclared : ParentSubObject { [JsonInclude] // This is fake, but what I am wishing existed public string B { get; set; } [JsonInclude] // This is fake, but what I am wishing existed public string C { get; set; } } public class NormalSubObject: ParentSubObject { public string B { get; set; } }

如果MainObj.SubObj是NormalSubObject,它将同时对A和B进行序列化,但是如果它是SubObjectWithOnlyDeclared,则将仅对B和C进行序列化,而忽略父属性

If MainObj.SubObj was a NormalSubObject it would serailize both A and B but if it was SubObjectWithOnlyDeclared it would serailize only B and C and ignore the parent property

推荐答案

您可以编写如下的自定义ContractResolver

You can write a custom ContractResolver like below

public class IgnoreParentPropertiesResolver : DefaultContractResolver { bool IgnoreBase = false; public IgnoreParentPropertiesResolver(bool ignoreBase) { IgnoreBase = ignoreBase; } protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) { var allProps = base.CreateProperties(type, memberSerialization); if (!IgnoreBase) return allProps; //Choose the properties you want to serialize/deserialize var props = type.GetProperties(~BindingFlags.FlattenHierarchy); return allProps.Where(p => props.Any(a => a.Name == p.PropertyName)).ToList(); } }

现在,您可以在序列化过程中使用它,如下所示:

Now you can use it in your serialization process as:

var settings = new JsonSerializerSettings() { ContractResolver = new IgnoreParentPropertiesResolver(true) }; var json1 = JsonConvert.SerializeObject(new SubObjectWithOnlyDeclared(),settings );

更多推荐

Json.net仅序列化某些属性

本文发布于:2023-11-14 21:31:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1588550.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:属性   序列化   Json   net

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!