【发布时间】:2017-08-01 18:11:21
【问题描述】:
我在使用 Azure Function Apps 时遇到了一个奇怪的问题。 Newtonsoft Json.NET 反序列化不喜欢 $type 注释。我的反序列化代码如下:
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 副本。请查看应用服务编辑器并从那里添加函数应用文件系统结构的描述。您是否正在自己加载任何程序集?
-
你也是用csx还是预编译函数dll?
-
@Jeff 我正在使用 csx。我一直在加载自己的程序集,但在添加 project.json 文件后删除了文件和导入。我现在得到一个不同的错误(上面更新)。
-
现在更有意义了。使用下面的答案,它会解决。
标签: c# json serialization json.net azure-functions