c# - 是否可以将 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”的成员已存在
解决方案
- 您可以尝试DefaultContractResolver。
- 不要标记相同的属性名称。
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);
}
}
推荐阅读
- android - Why will my android notification not send?
- flutter - 对 dart 和 flutter 的波斯字符串列表进行排序
- excel - 根据文件中的工作表名称从 pandas 数据框创建 csv 文件
- laravel - Eloquent hasOne 似乎在更新错误的表
- javascript - 如何在 cypress 中运行递归函数或使用异步等待查找长度
- c - 如何从 C 中的函数写入 char*
- laravel - 与master合并分支时app js出现合并冲突(laravel + vue)
- android - 对话框 - 不必要的多重绘图?
- manifest - 触发 Beforeinstallprompt 事件后添加到主屏幕不提示
- java - 给定一个整数数组,返回数组中 9 的个数