【问题标题】:Xamarin + JSON.NetXamarin + JSON.Net
【发布时间】:2013-12-17 22:55:24
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您在使用 Xamarin 表单吗?如果是这样,您可以将解析器包装在一个接口中,并通过依赖解析器提供一个特定于平台的实例。另外一个好处是,如果您决定将来使用另一个库,您的代码将不会被绑定到 JSON.NET。

标签: json xamarin.ios cross-platform json.net xamarin


【解决方案1】:

您应该可以为此使用JSon.NET NuGet Package。该实现实际上是特定于平台的 [1],但 NuGet 会透明地为您处理并为您选择正确的。

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

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

[1] NuGet 包包含用于不同目标框架的不同 .dll,然后为您的项目挑选并引用最佳的 - 因此您的应用程序将仅包含一个实现,但 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>

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

它应该可以工作。

一般来说,当您在添加新的 NuGet 包后收到关于缺少类型的错误消息时,请转到相应的包目录和 grep -r 以获取该符号 - 可能存在不使用此符号的不同实现输入。

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

【讨论】:

  • 太棒了!很快就会试试这个。同时,我确定如果我在 Tasky.Core 项目中引用“portable40”dll,在 iOS Tasky 项目中引用特定于设备的 dll,它似乎可以工作。你的方法听起来确实不那么笨拙,所以我会在早上试一试。
  • 所以 NuGet 对我的基本“核心”便携式库和 iOS 项目运行良好。但不适用于 Android(我得到 /Users/Steve/Projects/JSON3/JSON3/MyClass.cs(52,52): Error CS0012: The type System.Object' is defined in an assembly that is not referenced. Consider adding a reference to assembly System.Runtime, Version=4.0.0.0, Culture=中性,PublicKeyToken=b03f5f7f11d50a3a' (CS0012) (JSON3.Android)。如果我引用我从 Xamarin 商店下载的 DLL,它可以工作。
  • 同样的bug,很快也会有新版本的Xamarin.Android。作为一种解决方法,将 &lt;_HasReferenceToSystemRuntime&gt;true&lt;/_HasReferenceToSystemRuntime&gt; 添加到 .csproj 文件中的顶部 &lt;PropertyGroup&gt; 应该可以修复它。
  • 我遇到了同样的问题并且卡住了。我很高兴看到这个答案,直到我在 alpha 通道上获取 Xamarin.iOS 7.0.6 版本并看到它不存在(我看到的只是 7.0.5)。也不确定这个解决方案是否能解决我的环境(Windows Visual Studio)。有什么见解吗?
  • 其实我的问题不一样。我什至不能在 Xamarin iOS 项目中使用 NuGet JSON.Net。我今天看到 7.0.6 在 alpha 通道上弹出,我升级了。仍然没有喜悦。我可以创建一个全新的 iOS 项目,使用 NuGet 添加 JSON.Net,在 main.cs 中添加对 JSON.Net 的引用,构建并获取:类型“System.Dynamic.IDynamicMetaObjectProvider”在不是的程序集中定义参考。您必须添加对程序集“System.Dynamic.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多