Xamarin + JSON.Net

Ste*_*ald 15 json cross-platform json.net xamarin.ios xamarin

我无法理解为什么Newtonsoft JSON解析器必须是Xamarin下的设备特定.我似乎找不到任何方法让解析器存在于一个公共的共享库中.我正在使用Tasky Pro示例应用程序.我可以从Xamarin商店获取JSON.Net DLL,以便在Android和iOS项目中工作,但这没有任何架构意义.例如,SQLite的东西都在共享库中,正如您所期望的那样 - 作为一组c#源文件.

理想情况下,我想添加一些对"Tasky.Core"的引用,并能够序列化/反序列化JSON.

有没有办法让JSON.Net在共享库中工作(跨droid/ios/wp8)?尝试作为链接文件进行管理的来源非常庞大,如果可能的话......

如果没有,是否有一些管理JSON的替代方法将以这种方式工作?

Mar*_*lig 35

您应该能够使用JSon.NET NuGet包.实现实际上是特定于平台的[1],但NuGet将透明地为您处理并为您挑选正确的实现.

请注意,你需要Mono 3.2.6和Xamarin.iOS 7.0.6,本周刚刚进入alpha通道,我刚刚修复了这个领域的一些关键错误.您还应该将Xamarin Studio中的NuGet加载项升级到最新版本(0.8),其中包含几个与PCL相关的错误修复程序.

只需将NuGet加载项添加到Xamarin Studio中,如果尚未添加,则搜索"JSon.NET",加载项将自动安装包并为您添加所需的库引用.

[1] NuGet包包含针对不同目标框架的不同.dll,然后为您的项目选择和引用最佳的.db,因此您的应用程序将只包含单个实现,但iOS应用程序可能使用与桌面应用程序不同的.

2014年1月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>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net45+wp80+win8\Newtonsoft.Json.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll</HintPath>
</Reference>
Run Code Online (Sandbox Code Playgroud)

它应该工作.

通常,当您在添加新的NuGet包后收到有关缺少类型的错误消息时,请转到相应的包目录并grep -r为该符号 - 可能是有不同的实现不使用此类型.

希望未来可以提供更优雅的解决方案,但这需要与NuGet团队和软件包作者协调,因此需要一些时间.