はい、これはカスタムContractResolver
を使用して行うことができます。
コードを表示していないので、例を挙げておきます。下に示すようにクラスFoo
があるとします。私はId
とName
のプロパティをシリアル化出力に入れたいと思いますが、私はAlternateName
とColor
には興味がありません。私は[JsonIgnore]
とマークしました。私は説明が表示されるようにしたいが、時にはこれが本当に長くなることがあるので、長さを制限するためにカスタムJsonConverter
を使用した。また、説明に短いプロパティ名を使用したいので、[JsonProperty("Desc")]
とマークしました。
{
"Id": 1,
"Name": "Thing 1",
"Desc": "This is some lengthy text describing Thing 1 "
}
さて、私は時々、取得したいとしましょう:私は上記の...
Foo foo = new Foo
{
Id = 1,
Name = "Thing 1",
AlternateName = "The First Thing",
Description = "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.",
Color = "Yellow"
};
string json = JsonConvert.SerializeObject(foo, Formatting.Indented);
のインスタンスをシリアル化すると...私はこの出力を得る
class Foo
{
public int Id { get; set; }
public string Name { get; set; }
[JsonIgnore]
public string AlternateName { get; set; }
[JsonProperty("Desc")]
[JsonConverter(typeof(StringTruncatingConverter))]
public string Description { get; set; }
[JsonIgnore]
public string Color { get; set; }
}
私のカスタマイズを無視して、JSONの完全な出力。カスタムContractResolver
を使用して、クラスから属性をプログラムで「適用解除する」ことができます。ここでは、リゾルバのコードがあります:
class IgnoreJsonAttributesResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
foreach (var prop in props)
{
prop.Ignored = false; // Ignore [JsonIgnore]
prop.Converter = null; // Ignore [JsonConverter]
prop.PropertyName = prop.UnderlyingName; // restore original property name
}
return props;
}
}
リゾルバを使用するには、私はJsonSerializerSettings
にそれを追加し、このようなシリアライザに設定を渡す:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new IgnoreJsonAttributesResolver();
settings.Formatting = Formatting.Indented;
string json = JsonConvert.SerializeObject(foo, settings);
出力は今無視プロパティが含まれ、その説明はもはや切り捨てられていない。ここで
{
"Id": 1,
"Name": "Thing 1",
"AlternateName": "The First Thing",
"Description": "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.",
"Color": "Yellow"
}
全デモ:https://dotnetfiddle.net/WZpeWt
。 –