我有一些数据在c#数据集对象。我现在就可以使用类似这样的Json.net转换器来序列化它
DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);
但是,这将在打印到.json文件时使用数据中的属性名。我想改变属性名称是不同的(比如,改变'foo'到'bar')。
在Json.net文档中,在“序列化和反序列化JSON”→“序列化属性”下,它说“JsonPropertyAttribute…允许自定义名称”。但是没有例子。有人知道如何使用JsonPropertyAttribute将属性名更改为其他名称吗?
(直接链接到文档)
Json.net的文档似乎很少。如果你有一个很好的例子,我会把它添加到官方文档中。
谢谢!
如果您不能访问类来更改属性,或者不希望总是使用相同的重命名属性,也可以通过创建自定义解析器来重命名。
例如,如果你有一个名为MyCustomObject的类,它有一个名为LongPropertyName的属性,你可以使用这样的自定义解析器…
public class CustomDataContractResolver : DefaultContractResolver
{
public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(MyCustomObject))
{
if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
{
property.PropertyName = "Short";
}
}
return property;
}
}
然后调用序列化并提供解析器:
var result = JsonConvert.SerializeObject(myCustomObjectInstance,
new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });
结果将被缩短为{"Short":"prop value"}而不是{"LongPropertyName":"prop value"}
更多关于自定义解析器的信息
如果您不能访问类来更改属性,或者不希望总是使用相同的重命名属性,也可以通过创建自定义解析器来重命名。
例如,如果你有一个名为MyCustomObject的类,它有一个名为LongPropertyName的属性,你可以使用这样的自定义解析器…
public class CustomDataContractResolver : DefaultContractResolver
{
public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(MyCustomObject))
{
if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
{
property.PropertyName = "Short";
}
}
return property;
}
}
然后调用序列化并提供解析器:
var result = JsonConvert.SerializeObject(myCustomObjectInstance,
new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });
结果将被缩短为{"Short":"prop value"}而不是{"LongPropertyName":"prop value"}
更多关于自定义解析器的信息