我可以在c#的JsonProperty属性中使用资源字符串吗?



我正在连接一个可能在未来几个月进行重大修改的API,并且希望将相关的API标记存储在资源中,以确保在发生更改时可以轻松更新它们。

当我尝试在JsonProperty(通过Newtonsoft)属性中使用这些资源字符串时,然而,我遇到了以下错误:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

我已经尝试创建一个自定义属性来解决这个问题,但JsonProperty本身是密封的,是不可继承的。

有什么合理的方法可以让我处理这件事吗?我是不是错过了什么?

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);

相关内容

  • 没有找到相关文章

最新更新