Xamarin+;JSON.Net

Xamarin+;JSON.Net,json,xamarin.ios,cross-platform,json.net,xamarin,Json,Xamarin.ios,Cross Platform,Json.net,Xamarin,我很难理解为什么在Xamarin下Newtonsoft JSON解析器必须是特定于设备的。我似乎找不到任何方法让解析器存在于一个公共的、共享的库中。我正在使用Tasky Pro示例应用程序。我可以从Xamarin商店获得JSON.Net DLL,使其在Android和iOS项目中工作,但这在架构上没有任何意义。例如,正如您所期望的,SQLite内容都在一个共享库中——作为一组c#源文件 理想情况下,我只想添加对“Tasky.Core”的某种引用,并能够序列化/反序列化JSON 有没有办法让JSO

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

理想情况下,我只想添加对“Tasky.Core”的某种引用,并能够序列化/反序列化JSON

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


如果没有,是否有其他管理JSON的方法可以以这种方式工作?

您应该能够使用。该实现实际上是特定于平台的[1],但NuGet将透明地为您处理这些问题,并为您选择正确的实现

请注意,您需要Mono 3.2.6和Xamarin.iOS 7.0.6来完成这项工作,这周刚刚进入alpha频道,我刚刚修复了这方面的一些关键bug。您还应该将Xamarin Studio中的NuGet加载项升级到最新版本(0.8),其中包含几个与PCL相关的错误修复

如果您还没有添加到Xamarin Studio,只需添加,然后搜索“JSon.NET”,加载项将自动安装包并为您添加所需的库引用

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

2014年1月14日更新:

NuGet软件包通常包含不同的实现-不幸的是,由于iOS上不可用的API(如Reflection.Emit或Full DLR),并非所有的软件包都能与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文件.Replace

<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net45+wp80+win8\Newtonsoft.Json.dll</HintPath>
</Reference>

..\packages\Newtonsoft.Json.5.0.8\lib\portable-net45+wp80+win8\Newtonsoft.Json.dll


..\packages\Newtonsoft.Json.5.0.8\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll
它应该会起作用

一般来说,当您在添加新的NuGet包后收到关于缺少类型的错误消息时,请转到相应的包目录并
grep-r
查找该符号-可能存在不使用此类型的其他实现


希望将来会有一个更优雅的解决方案,但这需要与NuGet团队和包作者进行协调,因此需要一些时间。

只需通过NuGet将其添加到共享库中即可。实际上,所有请求/响应任务都应该在库中完成。您应该使用JSON.Net解析响应。

太棒了!尝试一下很快。与此同时,我决定,如果我在Tasky.Core项目中引用“portable40”dll,在iOS Tasky项目中引用特定于设备的dll,它似乎可以工作。你的方法听起来肯定不那么麻烦,所以我会在早上试一试。所以NuGet对我的基本“Core”工作得很好Portable lib,用于iOS项目。但不适用于Android(我得到/Users/Steve/Projects/JSON3/JSON3/MyClass.cs(52,52)错误CS012:类型<代码>系统。对象在未被引用的程序集中定义。考虑添加对程序集< /COD>系统>运行时,版本=4.0.0.0,Cule=中性,公共密钥令牌=B03F5F7F11D50A3A’(CSON12)(JSON3.Android)。如果我引用了我从Xamarin商店下载的DLL,它会正常工作。这是同一个错误,Xamarin.Android不久也会有一个新版本。作为一种解决方法,将
true
添加到你的.csproj文件的顶部
,这应该会解决它。我也有同样的问题,并且被卡住了。我很高兴看到这个答案,直到我在alpha频道上获得了Xamarin.iOS 7.0.6版本,发现它不存在(我看到的只是7.0.5)。我也不确定这个解决方案是否适合我的环境(Windows Visual Studio).有什么见解吗?事实上,我的问题是不同的。我甚至不能在Xamarin iOS项目中使用NuGet JSON.Net。我今天在alpha频道上看到7.0.6弹出,我升级了。仍然没有乐趣。我可以创建一个全新的iOS项目,使用NuGet添加JSON.Net,在main.cs中添加对JSON.Net的引用,构建并获取:类型'System.Dynamic.IDynamicMetaO'在未引用的程序集中定义了“Object Provider”。您必须添加对程序集“System.Dynamic.Runtime,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。是否使用Xamarin表单?如果是这样,您可以将解析器包装在接口中,并通过依赖项提供平台特定解析器的实例cy解析器。另外一个好处是,如果您决定将来使用另一个库,您的代码中就不会绑定到JSON.NET。
<Reference Include="Newtonsoft.Json">
  <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll</HintPath>
</Reference>