如何诊断返回空对象且没有错误的 Newtonsoft 反序列化器

问题描述

反序列化来自 API 调用的 JSON 结果,我首先使用 Json2cSharp.com 之类的东西创建了数据类。我正在使用 Newtonsoft.Json。

var content = response.Content.ReadAsstringAsync().Result;
DataClass.PurchaSEOrderResponse data = new DataClass.PurchaSEOrderResponse();
data = Newtonsoft.Json.JsonConvert.DeserializeObject<DataClass.PurchaSEOrderResponse>(content);

DeserializeObject 不返回“数据”,也没有错误或异常。

我可以在 Visual Studios 的内置 JSON 查看器和其他在线 JSON 查看器中查看从 API 调用返回的“内容”,并且内容似乎没问题。

有没有办法调查 Newtonsoft 可能发现 JsonConvert 例程有什么问题?

(P.S. 我在之前的 API 调用中使用了这个方法,它正在反序列化该内容

这是我的 JSON:

{
  "Item": [
    {
      "EmailSentCount": 0,"disableInventoryCount": false,"POType": 0,"CancelledPOID": 0,"TotalBalance": 8610.8,"TotalBalanceNotReceivedGood": 0.0,"vendorID": 13297,"PurchaseTitle": "","CreatedOn": "2021-03-02T15:47:21.757","CreatedBy": 75432,"OrderTotal": 0.0,"TaxTotal": 0.0,"ShippingTotal": 0.0,"GrandTotal": 8610.8,"DateOrdered": "2021-03-02T15:47:21.763","LastRevisedOn": "2021-03-17T18:14:39.653","RevisedBy": 104593,"PurchaSEOrderStatus": 3,"PaymentStatus": 10,"ExtraCharges": 0.0,"Totalrefunded": 0.0,"PurchaSEOrdeRSShippingStatus": 2,"TrackingNumber": "","TrackingNumbers": [
        {
          "ShippedOn": "0001-01-01T00:00:00","ShippingCarrier": "","TrackingNumber": ""
        }
      ],"ShippedOn": "0001-01-01T00:00:00","CourierService": "","PurchaSEOrdersPriority": 0,"ReceivingStatus": 2,"CompanyID": 163,"PurchaSEOrdersApproved": true,"DropShipOrderNumber": 0,"vendorInvoiceNumber": "21-6043-1","vendorInvoiceFileName": "","vendorInvoiceFileNameOriginal": "","Invoices": [
        {
          "InvoiceNumber": "21-6043-1"
        }
      ],"Memo": "","ExpectedDeliveryDate": "0001-01-01T00:00:00","discountTotal": 0.0,"bExported": false,"displayName": "Azomite Soil Products,LLC","CM": 0,"NotesCount": 0,"PaidOn": "0001-01-01T00:00:00","UnitCounts": 950,"PurchaSEOrderCreditMemo": false,"WarehouseID": 109,"Items": [
        {
          "ID": 4162,"SKU": "Azomite-44","vendorSKU": "","ProductName": "Azomite Micronized Bag,44 lb  Organic Trace mineral Powder-67 Essential minerals for You & Your Garden Bag","QtyOrdered": 950,"QtyReceived": 950,"UnitPrice": 9.064,"AdjustedPrice": 9.064,"Linetotal": 8610.8,"ExpectedDeliveryDate": null
        }
      ],"RequestedShippingCarrier": "","RequestedShippingService": "","ShipToAddress": {
        "IsShippingAddress": false,"IsBillingAddress": false,"AddressClassification": 0,"Notes": "","HomePhone": "","EmailAddress": "","Addressstatus": 1,"AddressSource": 17,"ID": -1,"FirstName": "Joe","MiddleInitial": "","LastName": "Toohey","CompanyName": "EasyGo Products Irvine","StreetLine1": "16661 Jamboree Rd.","StreetLine2": "","City": "Irvine","StateName": "CA","StateCode": "CA","PostalCode": "92606","CountryName": "","CountryCode": "US","PhoneNumber": "949-586-8470","Faxnumber": "","WebSiteURL": ""
      },"ID": 1428
    },{
      "EmailSentCount": 0,"TotalBalance": 952.0,"vendorID": 13295,"CreatedOn": "2021-03-02T12:56:37.643","GrandTotal": 952.0,"DateOrdered": "2021-03-02T12:56:37.663","LastRevisedOn": "2021-03-05T14:38:25.91","vendorInvoiceNumber": "61351","Invoices": [
        {
          "InvoiceNumber": "61351"
        }
      ],"displayName": "Lowes","UnitCounts": 280,"Items": [
        {
          "ID": 4161,"SKU": "Quikrete-50","ProductName": "Quikrete Play Sand - 50","QtyOrdered": 280,"QtyReceived": 280,"UnitPrice": 3.4,"AdjustedPrice": 3.4,"Linetotal": 952.0,"ID": 1427
    }
  ],"TotalResults": 2
}


   

解决方法

默认情况下,如果 JSON 与类模型不完全一致,Json.Net 不会抱怨。大多数与不获取数据有关的问题是由于模型在某种程度上与 JSON 不匹配。例如,名称可能拼写不同,或者属性定义不正确。

您可以通过将 JsonSerializerSettings 设置为 MissingMemberHandling 而不是 Error 来更改 Ignore 中的默认行为。这告诉序列化程序在 JSON 中存在模型中没有匹配属性的属性时抛出异常。此外,您可以在设置中设置一个错误处理程序,这将允许您捕获错误并根据需要继续。这样您就可以一次性获得所有错误的列表。

var settings = new JsonSerializerSettings
{
    MissingMemberHandling = MissingMemberHandling.Error,Error = (sender,eventArgs) => {
        Console.WriteLine(eventArgs.ErrorContext.Error.Message);  // or write to a log
        eventArgs.ErrorContext.Handled = true;
    }
};
var data = JsonConvert.DeserializeObject<PurchaseOrderResponse>(content,settings);

这是一个在启用上述设置的情况下将 JSON 反序列化为几乎完全空的类结构的演示:https://dotnetfiddle.net/9wJ0tu

,

问题已解决:

示例 JSON 返回值,当通过 Json2csharp 转换器(或其他转换器)时,返回公共类:

            public class Root
        {
            public List<Item> Item { get; set; }
            public int TotalResults { get; set; }
        }

对 deseriazeObject 的调用需要一个 .Root,如下所示:

var data = Newtonsoft.Json.JsonConvert.DeserializeObject<DataClass.PurchaseOrderResponse.Root>(content,settings);

现在一切都很幸福和满足。感谢所有帮助我学习的人。