是否可以在不向每个属性添加 [JsonProperty] 属性的情况下使用 JSON.NET 序列化静态属性。 示例类:
public class Settings
{
public static int IntSetting { get; set; }
public static string StrSetting { get; set; }
static Settings()
{
IntSetting = 5;
StrSetting = "Test str";
}
}
预期结果:
{
"IntSetting": 5,
"StrSetting": "Test str"
}
默认行为会跳过静态属性:
var x = JsonConvert.SerializeObject(new Settings(), Formatting.Indented);
最佳答案
您可以使用自定义契约(Contract)解析器来执行此操作。具体来说,您需要继承 DefaultContractResolver
并覆盖 GetSerializableMembers
函数:
public class StaticPropertyContractResolver : DefaultContractResolver
{
protected override List<MemberInfo> GetSerializableMembers(Type objectType)
{
var baseMembers = base.GetSerializableMembers(objectType);
PropertyInfo[] staticMembers =
objectType.GetProperties(BindingFlags.Static | BindingFlags.Public);
baseMembers.AddRange(staticMembers);
return baseMembers;
}
}
这里我们所做的就是调用 GetSerializableMembers
的基本实现,然后将 public static
属性添加到我们的成员列表中以进行序列化。
要使用它,您可以创建一个新的 JsonSerializerSettings
对象并将 ContractResolver
设置为 StaticPropertyContractResolver
的一个实例:
var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new StaticPropertyContractResolver();
现在,将这些设置传递给 JsonConvert.SerializeObject
,一切都应该正常工作:
string json = JsonConvert.SerializeObject(new Settings(), serializerSettings);
输出:
{
"IntSetting": 5,
"StrSetting": "Test str"
}
关于c# - 如何在不添加 [JsonProperty] 属性的情况下序列化 JSON.NET 中的静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30193871/