希望する結果を得るために使用できるかなり単純なアプローチがいくつかあります。
たとえば、現在次のように定義されているクラスがあるとします。
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
}
enum Fizz { Alpha, Beta, Gamma }
class Bang
{
public string Value { get; set; }
}
そして、あなたはこれをしたいです:
string json = @"{ ""ObsoleteSetting"" : ""Gamma"" }";
// deserialize
Config config = JsonConvert.DeserializeObject<Config>(json);
// migrate
config.ReplacementSetting =
new Bang { Value = config.ObsoleteSetting.ToString() };
// serialize
json = JsonConvert.SerializeObject(config);
Console.WriteLine(json);
これを取得するには:
{"ReplacementSetting":{"Value":"Gamma"}}
アプローチ1:ShouldSerializeメソッドを追加する
Json.NETには、ShouldSerialize
クラス内の対応するメソッドを探すことにより、プロパティを条件付きでシリアル化する機能があります。
この機能を使用するには、ブールShouldSerializeBlah()
メソッドをクラスに追加します。ここで、Blah
は、シリアル化しないプロパティの名前に置き換えます。このメソッドの実装が常に返されるようにしfalse
ます。
class Config
{
public Fizz ObsoleteSetting { get; set; }
public Bang ReplacementSetting { get; set; }
public bool ShouldSerializeObsoleteSetting()
{
return false;
}
}
注:このアプローチは好きだが、ShouldSerialize
メソッドを導入してクラスのパブリックインターフェースを混乱させたくない場合は、を使用しIContractResolver
てプログラムで同じことを行うことができます。ドキュメントの「条件付きプロパティのシリアル化」を参照してください。
アプローチ2:JObjectsでJSONを操作する
を使用JsonConvert.SerializeObject
してシリアル化を行う代わりに、configオブジェクトをにロードJObject
し、JSONから不要なプロパティを削除してから書き出します。ほんの数行の追加コードです。
JObject jo = JObject.FromObject(config);
// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();
json = jo.ToString();
アプローチ3:属性の賢い(ab)使用
- 適用する
[JsonIgnore]
シリアル化したくないプロパティに属性をます。
- 代替を追加し、 元のプロパティと同じタイプのプライベートプロパティセッターをクラスにます。そのプロパティの実装に元のプロパティを設定させます。
- 適用する
[JsonProperty]
属性を代替セッターにし、元のプロパティと同じJSON名を付けます。
ここに改訂されたConfig
クラスがあります:
class Config
{
[JsonIgnore]
public Fizz ObsoleteSetting { get; set; }
[JsonProperty("ObsoleteSetting")]
private Fizz ObsoleteSettingAlternateSetter
{
// get is intentionally omitted here
set { ObsoleteSetting = value; }
}
public Bang ReplacementSetting { get; set; }
}