我遇到了Azure功能應用程序的一個奇怪問題。 Newtonsoft Json.NET反序列化不喜歡$type
註釋。我反序列化的代碼如下所示:在Azure功能中序列化
return JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.Auto
});
JSON的樣子:
{
"$type": "Trading.Control.Json.TradingConfig, Trading",
"Config": {
"$type": "Trading.Control.Json.Config, Trading",
"Optimize": false
},
"Trading": {
"$type": "System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[Trading.Platforms.Credentials, Trading]], mscorlib",
...
,並連載有:
return JsonConvert.SerializeObject(o, new JsonSerializerSettings {
TypeNameHandling = TypeNameHandling.All,
Formatting = Formatting.Indented
});
的錯誤是:
2017-08-01T17:32:46.395 Type specified in JSON
'Trading.Control.Json.TradingConfig, Trading, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not compatible with
'Trading.Control.Json.TradingConfig, Trading, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Path '$type', line 2, position 56.
正如你可以看到,類型看起來是相同的湖此代碼在本地進行了良好測試,並按預期工作。無論我刪除多少個郵件,遇到的第一個$type
註釋都會在Azure上失敗。
我想繼續使用註釋,因爲我需要它們來反序列化從抽象類派生的對象。
這是在x64,.NET 4.7,Json.NET v10.0.3,Azure Function Apps v1.0.11027.0(〜1)中編譯的。我在bin文件夾中有Newtonsoft.Json.dll文件,用#r "Newtonsoft.Json.dll"
來引用它。有任何想法嗎?非常感激。
編輯: 我也嘗試添加project.json文件看起來像:
{
"frameworks": {
"net47":{
"dependencies": {
"Newtonsoft.Json": "10.0.3"
}
}
}
}
其成功安裝。我刪除了我上傳的彙編文件,並導入了#r
。錯誤是現在:
2017-08-01T18:30:18.971 Error resolving type specified in JSON 'Trading.Control.Json.TradingConfig, Trading'. Path '$type', line 2, position 56.
我懷疑有一個「基名稱空間」或某些查找錯誤。
該函數的文件系統看起來像:/site/wwwroot/TimerTriggerCSharp3/
,程序集位於bin文件夾中。他們全部裝入#r
進口,這工作正常。
你最有可能加載的dll的兩個副本。請查看應用服務編輯器,並從那裏添加功能應用程序文件系統結構的描述。你在做任何裝配嗎? – Jeff
你還使用csx或預編譯的函數DLL? – Jeff
@Jeff我正在使用csx。我一直在加載自己的程序集,但在添加project.json文件後刪除了文件和導入。我現在正在得到一個不同的錯誤(更新上面)。 – Osan