使用JsonConvert(expando, formatting, serializerSettings)
時,可以忽略ExpandoObject
屬性,特別是Delegate
類型的屬性嗎?使用JSON.Net串行器設置忽略ExpandoObject屬性
基本上我試圖忽視的func
屬性的所有分析在這個例子中的expando對象:
//{
// func:() => {}
//}
Action func =() => {};
dynamic expando = new ExpandoObject();
expando.func = func;
// should be empty object {}
string json = JsonConvert(expando, formatting, serializerSettings);
我想的第一件事就是壓倒一切的轉換器。不幸的是,這不起作用,因爲我看到CanConvert
遞歸調用Action
→DelegateEntry
→某些通用類型→RuntimeMethodInfo
。
private class ExpandoObjectIgnoreConverter : ExpandoObjectConverter
{
public override bool CanConvert(Type objectType)
{
if (typeof(Delegate).IsAssignableFrom(objectType))
{
return false;
}
return base.CanConvert(objectType);
}
}
一種在串行化設置和合約解析器中使用錯誤處理程序的方法。當我拋出錯誤時,將忽略該屬性的所有進一步處理,即Action
→
。但是,如果可能的話,我希望比拋出異常更優雅。DelegateEntry
→某些通用類型→
RuntimeMethodInfo
錯誤處理程序:
serializationSettings.Error = (sender, args) =>
{
if (args.ErrorContext.Error is InvalidCastException)
{
args.ErrorContext.Handled = true;
}
}
合同解析:
private class ExpandoObjectContractResolver : DefaultContractResolver
{
public override JsonContract ResolveContract(Type type)
{
if (typeof(Delegate).IsAssignableFrom(type))
{
throw new InvalidCastException();
}
else
{
return base.ResolveContract(type);
}
}
}
我使用edge庫腳本從C#程序中的NodeJS。我試圖從C#中返回的javascript對象中刪除函數,因爲它們被分配了Delegate
類型,與JsonConvert
不匹配。
我有點不清楚你的問題是什麼。當*序列化*時你試圖跳過委託值'ExpandoObject'屬性嗎?因爲這聽起來像是你試圖反序列化這個樣本json:'{ func:()=> {} }',這是無效的。 – dbc
更新了該部分以使其更加清晰,這是在expando到json的序列化期間。 –