0

今後数か月で大幅に変更される可能性のあるAPIに接続しており、変更が発生したときに簡単に更新できるように、相関するAPIタグをリソースに保存したいと考えています。

ただし、JsonPropertyで(Newtonsoftを介して)これらのリソース文字列を使用しようとすると、次のエラーが発生します。

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

この問題を解決するためにカスタム属性を作成しようとしましたが、JsonProperty自体は封印されており、継承できません。

私がこれに取り組むための合理的な方法はありますか?私は何かが足りないのですか?

4

1 に答える 1

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);
于 2013-03-05T23:28:53.880 に答える