我正在连接到可能在未来几个月内显着修改的API,并且希望将相关的API标记存储在资源中,以确保在发生更改时可以轻松更新它们。
但是,当我尝试在JsonProperty(通过Newtonsoft)属性中使用这些资源字符串时,我遇到以下错误:
An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type
我尝试创建自定义属性来解决问题,但JsonProperty本身是密封的并且是不可继承的。
我有合理的方法来解决这个问题吗?我只是错过了一些东西吗?
答案 0 :(得分:2)
JsonPropertyAttribute
控制如何将类序列化为JSON并返回。如果您在资源文件中定义了实际的json属性名称,那么将序列化类的方式将随着这些资源文件的更新而更改,或者即使您的应用程序只是切换到其他语言环境也是如此。这通常不是一个好主意。
但是,如果您的程序频繁更改以至于您希望能够在不重新编译的情况下修改类的序列化,或者您希望有多种方法序列化类,我相信您必须编写拥有IContractResolver
。
以下是一个例子:
public class ResourceNameContractResolver :
CamelCasePropertyNamesContractResolver
{
protected override IList<JsonProperty> CreateProperties CreatePropertiesInternal(Type type, MemberSerialization memberSerialization)
{
var list = base.CreateProperties(type, memberSerialization)
foreach (JsonProperty p in list)
{
p.PropertyName = this.GetRealNameFromResourceFile(p.PropertyName);
}
return list;
}
private string GetRealNameFromResourceFile(string originalPropertyName)
{
// Look up name from resource file
}
}
并使用此课程
var settings = new JsonSerializerSettings()
{
ContractResolver = new ResourceNameContractResolver()
};
JsonTextWriter writer = new JsonTextWriter(...);
JsonSerializer serializer = JsonSerializer.Create(settings);
serializer.Serialize(writer, myData);