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

C# Xamarin iOS项目中的Newtonsoft.Json反序列化对象,c#,xamarin.forms,xamarin.ios,json.net,xamarin-live-player,C#,Xamarin.forms,Xamarin.ios,Json.net,Xamarin Live Player,在我的Xamarin.Forms项目中,我有一些非常奇怪的行为 我正在从RESTAPI检索一些序列化数据。然后我尝试使用Json.NET将其反序列化到一个对象 这在Android上运行得非常好,如果我将代码复制到.NET控制台应用程序中,它也可以运行。但是在我的iOS项目中,对.DeserializeObject()的调用只返回null。它不会以任何方式抛出错误或抱怨 我确实发现了这个讨论:,但我没有首先链接所有程序集,并试图设置t.J.Purtell.1752建议的属性 也没用 有人能告诉我在

在我的Xamarin.Forms项目中,我有一些非常奇怪的行为

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

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

我确实发现了这个讨论:,但我没有首先链接所有程序集,并试图设置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> ();
Item=JObject.Parse(json.ToObject();

是的,这是一种丑陋的修复,但如果它工作,它工作:)

请像这样尝试:

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

是的,这是一种丑陋的修复,但如果它正常工作,它也正常工作:)

基于返回的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; }
}
公共类Isbn{
公共字符串Isbn10{get;set;}
公共字符串Isbn13{get;set;}
}
公共类项目{
公共Isbn Isbn{get;set;}
公共字符串标题{get;set;}
公共IList作者{get;set;}
公共字符串发布程序{get;set;}
公共字符串ReleaseDate{get;set;}
public int PageCount{get;set;}
公共字符串说明{get;set;}
公共字符串ThumbnailUrl{get;set;}
}
然后像这样反序列化

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

基于返回的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; }
}
公共类Isbn{
公共字符串Isbn10{get;set;}
公共字符串Isbn13{get;set;}
}
公共类项目{
公共Isbn Isbn{get;set;}
公共字符串标题{get;set;}
公共IList作者{get;set;}
公共字符串发布程序{get;set;}
公共字符串ReleaseDate{get;set;}
public int PageCount{get;set;}
公共字符串说明{get;set;}
公共字符串ThumbnailUrl{get;set;}
}
然后像这样反序列化

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

非常感谢到目前为止所有的回复!不幸的是,他们没有一个为我工作

经过多次尝试和错误,我发现我能够像这样访问我的数据:

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

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

非常感谢到目前为止所有的回复!不幸的是,他们没有一个为我工作

经过多次尝试和错误,我发现我能够像这样访问我的数据:

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

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

刚刚回到这个问题上。如果有人想知道:我最近不得不使用的Xamarin Live播放器在Json.NET上有一些问题。()


我知道这一定是件愚蠢的事。。。也许我可以帮别人省点时间

刚刚回到这个问题上。如果有人想知道:我最近不得不使用的Xamarin Live播放器在Json.NET上有一些问题。()


我知道这一定是件愚蠢的事。。。也许我可以帮别人省点时间

将iOS构建链接器行为设置为“仅链接框架SDK”修复了这一问题

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


链接框架SDK只能防止我的应用程序类发生这种情况,这在我的conmtext中很好。

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

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

链接框架SDK只能防止我的应用程序类发生这种情况,这在我的conmtext中没有问题。

可能的原因

  • 反序列化对象没有默认构造函数。。刚出现的 Foo()
  • 构造函数包含复杂的对象,如ICommand、DelegateCommand
  • 反序列化对象的某些属性是复杂对象,在序列化、反序列化过程中会消耗计算能力
  • 未仅选择链接帧字SDK
  • 可能原因

  • 反序列化对象没有默认构造函数。。刚出现的 Foo()
  • 构造函数包含复杂的对象,如ICommand、DelegateCommand
  • 反序列化对象的某些属性是复杂对象,在序列化、反序列化过程中会消耗计算能力
  • 未仅选择链接帧字SDK

  • 为了避免混淆,您是否在.iOS项目中引用了JSON库?是的,我有。我也尝试了不同的版本,但由于它似乎没有任何区别,我目前使用的是最新的稳定版本。为了避免混淆,您有在.iOS项目中引用的JSON库吗?是的,我有。我也尝试了不同的版本,但由于它似乎没有任何区别,我目前正在使用最新的稳定版本。谢谢你的提示!但是现在我得到了一个异常“从JsonReader读取JObject时出错。当前JsonReader项不是对象”@japhwil你能分享你收到的json吗?谢谢你的提示!但现在我得到了一个异常“从JsonReader读取JObject时出错。当前JsonReader项不是对象”@japhwil您可以共享您收到的json吗?这正是我要做的,只是我直接进入一个列表对象:var books=JsonConvert.DeserializeObject(响应)。A.