首页 > 解决方案 > 是否可以将 ShouldSerialize 与 2 个相同的 json 属性名称一起使用?

问题描述

public class Style
{
    [JsonProperty("cornerRadius")]
    public double CornerRadius { get; set; }

    [JsonProperty("cornerRadius")]
    public BorderRadiusObject BorderRadius { get; set; }

    public bool ShouldSerializeCornerRadius()
    {
        return false;
    }
    public bool ShouldSerializeBorderRadius()
    {
        return true;
    }
}
public class BorderRadiusObject
{
    public double A { get; set; }
    public double B { get; set; }
    public double C { get; set; }
    public double D { get; set; }
}

是否可以Style使用 ShouldSerialize 方法序列化具有 2 个相同 json 属性名称的对象?

当我尝试序列化Style对象时,我在下面看到错误

Newtonsoft.Json.JsonSerializationException:名为“cornerRadius”的成员已存在

标签: c#jsonjson.net

解决方案


    public class ShouldSerializeContractResolver : DefaultContractResolver
    {
        public new static readonly ShouldSerializeContractResolver Instance = new ShouldSerializeContractResolver();

        protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
        {
            JsonProperty property = base.CreateProperty(member, memberSerialization);

            if (member.Name == "BorderRadius" && Style.ShouldSerializeBorderRadius())
            {
                property.PropertyName = "cornerRadius";
                property.ShouldSerialize =
                    instance => { return true; };
            }

            if (member.Name == "CornerRadius" && Style.ShouldSerializeCornerRadius())
            {
                property.PropertyName = "cornerRadius";
                property.ShouldSerialize =
                    instance => { return true; };
            }

            return property;
        }
    }

    public class Style
    {
        public double CornerRadius { get; set; } = 9.9;
        public BorderRadiusObject BorderRadius { get; set; } = new BorderRadiusObject();
        public static bool ShouldSerializeCornerRadius()
        {
            return false;
        }

        public static bool ShouldSerializeBorderRadius()
        {
            return true;
        }
    }

    public class BorderRadiusObject
    {
        public double A { get; set; } = 1;
        public double B { get; set; } = 2;
        public double C { get; set; } = 3;
        public double D { get; set; } = 4;
    }

    class Program
    {
        static void Main(string[] args)
        {
            var memberJson = Newtonsoft.Json.JsonConvert.SerializeObject(new Style(),
                new JsonSerializerSettings {ContractResolver = new ShouldSerializeContractResolver()});

            Console.WriteLine(memberJson);
        }
    }


推荐阅读