1

我的 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,但我没有链接首先所有程序集并尝试设置 TJPurtell.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"
   }
]
4

6 回答 6

4

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

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

于 2017-11-25T18:54:14.447 回答
2

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

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

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

于 2017-12-02T18:38:34.850 回答
1

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

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

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

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

于 2017-11-20T15:30:05.723 回答
1

根据返回的 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);
于 2017-11-19T23:06:58.643 回答
0

请尝试这样:

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

是的,这是一种丑陋的修复,但如果它有效,它就有效:)

于 2017-11-19T17:07:37.743 回答
0

可能的原因

  1. 反序列化的对象没有默认构造函数.. new Foo()
  2. 构造函数包含复杂的对象,例如 ICommand、DelegateCommand。
  3. 反序列化对象的某些属性是复杂对象,在序列化、反序列化过程中会消耗计算能力。
  4. 不只选择 Link Frameword SDK
于 2019-07-10T12:32:00.587 回答