Json.net仅序列化某些属性

时间:2018-06-21 17:43:42

标签: c# serialization attributes json.net

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.SubObjNormalSubObject,则将同时对A和B进行序列化,但是如果它是SubObjectWithOnlyDeclared,则将仅对B和C进行序列化,而忽略父属性

4 个答案:

答案 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
};