これは、カスタム契約リゾルバを使用してかなり簡単に行うことができます。ここでは、必要となるすべてのコードです:
class LongNameContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
// Let the base class create all the JsonProperties
// using the short names
IList<JsonProperty> list = base.CreateProperties(type, memberSerialization);
// Now inspect each property and replace the
// short name with the real property name
foreach (JsonProperty prop in list)
{
prop.PropertyName = prop.UnderlyingName;
}
return list;
}
}
はここリゾルバを使用してクイックデモです:
class Program
{
static void Main(string[] args)
{
Foo foo = new Foo
{
CustomerName = "Bubba Gump Shrimp Company",
CustomerNumber = "BG60938"
};
Console.WriteLine("--- Using JsonProperty names ---");
Console.WriteLine(Serialize(foo, false));
Console.WriteLine();
Console.WriteLine("--- Ignoring JsonProperty names ---");
Console.WriteLine(Serialize(foo, true));
}
static string Serialize(object obj, bool useLongNames)
{
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Formatting = Formatting.Indented;
if (useLongNames)
{
settings.ContractResolver = new LongNameContractResolver();
}
return JsonConvert.SerializeObject(obj, settings);
}
}
class Foo
{
[JsonProperty("cust-num")]
public string CustomerNumber { get; set; }
[JsonProperty("cust-name")]
public string CustomerName { get; set; }
}
は出力:
--- Using JsonProperty names ---
{
"cust-num": "BG60938",
"cust-name": "Bubba Gump Shrimp Company"
}
--- Ignoring JsonProperty names ---
{
"CustomerNumber": "BG60938",
"CustomerName": "Bubba Gump Shrimp Company"
}
ちょうど 'JsonProperty'を削除し、応じて匿名オブジェクトを返します渡されたパラメータに渡します。 'new {UserName = uname} 'のようなもの –
私は最良の方法は、(json.NETを使って、最初からではなく)カスタムシリアライザを作成し、アノテーションを削除することだと思います。短い名前と長い名前をシリアライザの設定にして、シリアライザの時に必要なものを伝えるだけです。 json.NETは、実行時にアノテーションを使用/無視する機能をサポートしていません。彼らがコンパイル時にそこにいるなら、それらは使用されます(いくつかの主要なハッキングを禁止します)。 – evanmcdonnal
コメントをいただきありがとうございます。 @evanmcdonnal:カスタムシリアライザを使用した場合、DTO固有のレベル(すべてのDTOに添付されていますか?)でこれを行う必要がありますか?多くの開発チームを通じて多くのDTOが多数のソリューションに広がっています。理想的には、シリアル化プロセスに取り付ける比較的洗練された方法を見つけることができます。 – Kevin