這可以很容易地使用自定義的合同解析器來完成。這裏是所有的代碼,你將需要:
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'並返回根據一個匿名對象到你傳遞的參數。像'新{用戶名= UNAME}' –
我認爲最好的辦法是做一個自定義的串行器(與json.NET,而不是從頭開始),並刪除註釋。使用短名稱和長名稱作爲序列化程序的設置,並在序列化時告訴它你想要什麼。 json.NET不支持在運行時使用/忽略註釋。如果他們在編譯時在那裏,他們將被使用(禁止一些主要的黑客攻擊)。 – evanmcdonnal
我欣賞那裏的評論。 @evanmcdonnal:如果我們有一個自定義序列化去,就需要我們做這個特定的DTO級我們有很多的DTO通過我們的許多開發團隊分散翻過許多解決方案(連接到每一個DTO?)。理想情況下,我們可以找到一種相對優雅的方式來加入到序列化過程中,而無需通過所有DTO進行觸摸並保持這種方式。 – Kevin