Newtonsoft.Json 反序列化 Xamarin iOS 项目中的对象

Newtonsoft.Json deserialize object in Xamarin iOS project

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

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

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

我确实找到了这个讨论:https://forums.xamarin.com/discussion/15152/deserialization-not-working-with-json-net-on-ios-device-ios-simulator-works,但我没有首先 link 所有程序集并尝试设置 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"
   }
]

请这样尝试:

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

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

基于返回的 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);

非常感谢到目前为止的所有回复!可悲的是 none 他们为我工作。

经过反复试验,我发现我可以像这样访问我的数据:

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

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

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

我知道它一定是愚蠢的...好吧,也许我可以节省一些时间!

将 iOS Build Linker Behavior 设置为 "Link Framework SDKs only" 为我解决了这个问题。

如 T.J.Purtell.1752 在引用的 xamarin 线程中所述,Xamarin Linker 将去除未使用的类型、方法和字段。

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

可能的原因

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