実際には、必要な結果を得るために使用できるかなり単純なアプローチがいくつかあります。
たとえば、クラスが現在次のように定義されているとします。
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 メソッドを追加する
ShouldSerialize
Json.NET には、クラス内の対応するメソッドを 探すことによって、プロパティを条件付きでシリアル化する機能があります。
この機能を使用するには、ブール値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: 属性の巧妙な (乱用) 使用
[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; }
}