我很难理解为什么Newtonsoft JSON解析器必须在Xamarin下特定于设备。我似乎找不到任何方法让解析器存在于一个通用的共享库中。我正在使用 Tasky Pro 示例应用程序。我可以从Xamarin商店获得 JSON.Net DLL以在Android和iOS项目中工作,但这没有任何建筑意义。例如,SQLite 的东西都在一个共享的库中,正如你所期望的那样 - 作为一组 c# 源文件。
理想情况下,我只想添加对"Tasky.Core"的某种引用,并能够序列化/反序列化 JSON。
有没有办法让 JSON.Net 在共享库中工作(跨机器人/ios/wp8)?如果可能的话,尝试作为链接文件进行管理的来源非常大......
如果没有,是否有其他方法来管理JSON可以以这种方式工作?
你应该能够为此使用 JSon.NET NuGet 包。 该实现实际上是特定于平台的 [1],但 NuGet 将透明地为您处理并为你选择正确的实现。
请注意,您需要Mono 3.2.6和Xamarin.iOS 7.0.6,本周刚刚进入alpha频道,我刚刚修复了该领域的一些关键错误。 还应将 Xamarin Studio 中的 NuGet 外接程序升级到最新版本 (0.8),其中包含多个与 PCL 相关的 bug 修复。
只需将 NuGet 外接程序添加到 Xamarin Studio (如果尚未这样做),然后搜索"JSon.NET",外接程序将自动安装包并为你添加所需的库引用。
[1] NuGet 包包含针对不同目标框架的不同.dll,然后为项目选择并引用最佳框架 - 因此应用程序将只包含一个实现,但 iOS 应用可能使用与桌面应用程序不同的实现。
更新 01/14/14:
NuGet 包通常包含不同的实现 - 遗憾的是,由于 Reflection.Emit 或 Full DLR 等 API 在 iOS 上不可用,并非所有包都能与 Xamarin.iOS 配合使用。
如果查看packages/Newtonsoft.Json.5.0.8/lib/
目录,会看到不同的子目录 - 每个子目录都包含不同的实现,NuGet 将使用最适合当前目标框架的实现。 不幸的是,NuGet 并不总是选择正确的一个:-(
对于Newtonsoft.Json.5.0.8,"portable-net45+wp80+win8"实现使用iOS上不可用的DLR功能,"portable-net40+sl4+wp7+win8"是可以的。 因此,如果将 NuGet 包添加到面向例如 Profile136 的 PCL,则会获得正确的实现。
没有 GUI 可以选择其他实现,但您可以编辑 .csproj 文件。 取代
<Reference Include="Newtonsoft.Json">
<HintPath>..packagesNewtonsoft.Json.5.0.8libportable-net45+wp80+win8Newtonsoft.Json.dll</HintPath>
</Reference>
跟
<Reference Include="Newtonsoft.Json">
<HintPath>..packagesNewtonsoft.Json.5.0.8libportable-net40+sl4+wp7+win8Newtonsoft.Json.dll</HintPath>
</Reference>
它应该有效。
通常,如果在添加新的 NuGet 包后收到有关缺少类型的错误消息,请转到相应的包目录并grep -r
该符号 - 很可能存在不使用此类型的其他实现。
希望将来能提供更优雅的解决方案,但这需要与 NuGet 团队和包作者协调,因此需要一些时间。
只需通过NuGet将其添加到共享库即可。实际上,您的所有请求/响应任务都应该在库中完成。应使用 JSON.Net 来分析响应。