Json.net仅序列化某些属性 [英] Json.net serialize only certain properties
问题描述
Json.net可以通过任何方式仅指定要序列化的属性吗?还是基于绑定标志(例如仅声明的)序列化某些属性?
Does Json.net 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仅序列化某些属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!