Json.net可以通过任何方式仅指定要序列化的属性吗?还是基于绑定标志(如仅声明的)序列化某些属性?
现在,我正在使用JObject.FromObject(MainObj.SubObj);
来获取SubObj的所有属性,SubObj是遵循ISubObject接口的类的实例:
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进行序列化,而忽略父属性
答案 0 :(得分:4)
不必像其他答案中建议的那样,对每个不想序列化的属性都使用[JsonIgnore]
。
如果只想指定要序列化的属性,则可以使用[JsonObject(MemberSerialization.OptIn)]
和[JsonProperty]
属性来执行此操作,例如:
using Newtonsoft.Json;
...
[JsonObject(MemberSerialization.OptIn)]
public class Class1
{
[JsonProperty]
public string Property1 { set; get; }
public string Property2 { set; get; }
}
这里只有Property1
被序列化。
答案 1 :(得分:3)
您可以编写如下的自定义ContractResolver
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();
}
}
现在,您可以在序列化过程中以以下方式使用它:
var settings = new JsonSerializerSettings() {
ContractResolver = new IgnoreParentPropertiesResolver(true)
};
var json1 = JsonConvert.SerializeObject(new SubObjectWithOnlyDeclared(),settings );
答案 2 :(得分:1)
不确定为什么@Eser选择将答案写为您的问题的注释,而不是实际答案...无论如何,它们是正确的。
将[JsonIgnore]
属性应用于您要忽略的任何属性。
答案 3 :(得分:0)
如果对象上的属性为null或默认值,则可以让json.net忽略它,而不能通过以下方式序列化它:
var settings = new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore
};
JsonConvert.SerializeObject(myObject, settings);
编辑:
或全局默认设置,只需执行一次:
JsonConvert.DefaultSettings = () => new JsonSerializerSettings
{
DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore
};