【问题标题】:Newtonsoft.Json deserialize object in Xamarin iOS projectNewtonsoft.Json 反序列化 Xamarin iOS 项目中的对象
【发布时间】:2018-05-02 21:46:28
【问题描述】:

我的 Xamarin.Forms 项目出现了一些非常奇怪的行为。

我正在从 REST API 检索一些序列化数据。然后我尝试使用 Json.NET 将其反序列化为一个对象。

这在 Android 上运行良好,如果我将代码复制到 .NET 控制台应用程序,它也可以运行。但是在我的 iOS 项目中,对 .DeserializeObject() 的调用只返回 null。它不会以任何方式抛出错误或抱怨。

我确实找到了这个讨论:https://forums.xamarin.com/discussion/15152/deserialization-not-working-with-json-net-on-ios-device-ios-simulator-works,但我没有首先链接所有程序集并尝试设置 T.J.Purtell.1752 建议的属性 也没有用。

谁能告诉我在这里做什么?

非常感谢!

一月

编辑

这是我尝试反序列化的示例响应:

[
   {
      "Isbn":{
         "Isbn10":"0099910101",
         "Isbn13":"9780099910107"
      },
      "Title":"A Farewell to Arms",
      "Authors":[
         "Ernest Hemingway"
      ],
      "Publisher":"Random House",
      "ReleaseDate":"1994",
      "PageCount":293,
      "Description":"In 1918 Ernest Hemingway went to war, to the 'war to end all wars'. He volunteered for ambulance service in Italy, was wounded and twice decorated. Out of his experiences came A Farewell to Arms. Hemingway's description of war is unforgettable. He recreates the fear, the comradeship, the courage of his young American volunteer and the men and women he meets in Italy with total conviction. But A Farewell to Arms is not only a novel of war. In it Hemingway has also created a love story of immense drama and uncompromising passion.",
      "ThumbnailUrl":"http://books.google.com/books/content?id=m68LhBiNv8YC&printsec=frontcover&img=1&zoom=1&source=gbs_api"
   },
   {
      "Isbn":{
         "Isbn10":"9044538780",
         "Isbn13":"9789044538786"
      },
      "Title":"Het huis van de namen",
      "Authors":[
         "Colm Tóibín"
      ],
      "Publisher":"Singel Uitgeverijen",
      "ReleaseDate":"2017-08-24",
      "PageCount":0,
      "Description":"Klytaimnestra heeft veel moeten doorstaan. Haar man heeft haar kind, haar mooie oudste dochter, geofferd aan de goden, en zij heeft hem niet kunnen tegenhouden. Hoe kan ze dit ooit te boven komen? En hoe zullen haar andere twee kinderen reageren op deze ontwrichtende gebeurtenis? Eén ding neemt ze zich voor: haar man zal dit met de dood moeten bekopen.",
      "ThumbnailUrl":"http://books.google.com/books/content?id=yl8yDwAAQBAJ&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api"
   }
]

【问题讨论】:

  • 为了避免混淆,.iOS 项目中是否引用了 JSON 库?
  • 是的,我愿意。我也尝试了不同的版本,但由于它似乎没有任何区别,我目前正在使用最新的稳定版本。

标签: c# xamarin.forms xamarin.ios json.net xamarin-live-player


【解决方案1】:

刚刚回到这个问题。万一有人想知道:原来我最近不得不使用的 Xamarin Live Player 在 Json.NET 方面存在一些问题。 (https://developer.xamarin.com/guides/cross-platform/live/limitations/)

我知道这一定很愚蠢……好吧,也许我可以为别人节省一些时间!

【讨论】:

【解决方案2】:

将 iOS 构建链接器行为设置为“仅链接框架 SDK”为我解决了这个问题。

正如 T.J.Purtell.1752 在引用的 xamarin 线程中描述的那样,Xamarin 链接器将去除未使用的类型、方法和字段。

Link Framework SDKs 只防止我的应用程序类发生这种情况,这在我的上下文中很好。

【讨论】:

  • 感谢@zef 的回答!但正如我所说,问题只是我使用了 Xamarin Live Player 并且没有检查它对 Json.NET 的限制。
  • 当然,但上述问题在 Live Player 之外也存在。这个问题和 Xamarin 线程的链接帮助了我,并且可能会帮助其他人。
【解决方案3】:

根据返回的 JSON,需要将其反序列化为对象映射的数组

public class Isbn {
    public string Isbn10 { get; set; }
    public string Isbn13 { get; set; }
}

public class Item {
    public Isbn Isbn { get; set; }
    public string Title { get; set; }
    public IList<string> Authors { get; set; }
    public string Publisher { get; set; }
    public string ReleaseDate { get; set; }
    public int PageCount { get; set; }
    public string Description { get; set; }
    public string ThumbnailUrl { get; set; }
}

然后像反序列化

var items = JsonConvert.DeserializeObject<Item[]>(json);

【讨论】:

  • 这正是我正在做的事情,只是我要直接使用 List 对象:var books = JsonConvert.DeserializeObject>(response)。我的意思是它可以在 Android 和其他任何地方运行,所以 iOS 存在一些问题。
  • 您是否考虑过 iOS 处理 HTTP 响应的方式可能不同?可能值得做一些谷歌搜索。我们在 iOS 应用程序中使用 JsonConvert 的方式与您完全相同,唯一可能不同的是您在 iOS 中处理这些响应的方式。
  • @Digitalsa1nt 我已经考虑过了。但是当我调试在我的 iPhone 上运行的应用程序时,我看到字符串响应正常。您能否分享一下 Json.NET 的确切版本以及您如何使用反序列化方法,以便我可以尝试一下?
  • 非常感谢,这个方法比使用 System.Convert.ToString 更好
【解决方案4】:

非常感谢到目前为止的所有回复!遗憾的是,它们都不适合我。

经过大量试验和错误后,我发现我能够像这样访问我的数据:

var blub = JsonConvert.DeserializeObject(booksString);
foreach (var element in (JArray)blub)
{
    var blublub = ((JObject)element).SelectToken("$.Title").ToString();
}

但如果我不得不以这种方式实现我的整个 API,那将是绝对痛苦的……你们还有其他想法吗?

【讨论】:

    【解决方案5】:

    请尝试这样:

    Item item = JObject.Parse (json).ToObject<Item> ();
    

    是的,这是一种丑陋的修复,但如果它起作用了,它就起作用了 :)

    【讨论】:

    • 感谢您的提示!但现在我收到一个异常“从 JsonReader 读取 JObject 时出错。当前 JsonReader 项目不是对象”
    • @japhwil 你能分享一个你收到的 json 吗?
    【解决方案6】:

    可能的原因

    1. 反序列化的对象没有默认构造函数.. new Foo()
    2. 构造函数包含ICommand、DelegateCommand等复杂对象。
    3. 反序列化对象的某些属性是复杂对象,在序列化、反序列化过程中会消耗计算能力。
    4. 没有选择仅链接帧字 SDK

    【讨论】:

      猜你喜欢
      • 2023-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多