C# 如何诊断返回空对象且无错误的Newtonsoft反序列化程序

C# 如何诊断返回空对象且无错误的Newtonsoft反序列化程序,c#,error-handling,json.net,json-deserialization,C#,Error Handling,Json.net,Json Deserialization,通过反序列化API调用的JSON结果,我首先使用类似于Json2cSharp.com的东西创建了数据类。我正在使用Newtonsoft.Json var content = response.Content.ReadAsStringAsync().Result; DataClass.PurchaseOrderResponse data = new DataClass.PurchaseOrderResponse(); data = Newtonsoft.Json.JsonConvert.Deser

通过反序列化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);

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

您可以通过将
MissingMemberHandling
设置为
Error
而不是
Ignore
来更改
JsonSerializerSettings
中的默认行为。这告诉序列化程序,只要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);
var设置=新的JsonSerializerSettings
{
MissingMemberHandling=MissingMemberHandling.Error,
错误=(发送方,事件参数)=>{
Console.WriteLine(eventArgs.ErrorContext.Error.Message);//或写入日志
eventArgs.ErrorContext.Handled=true;
}
};
var data=JsonConvert.DeserializeObject(内容、设置);
下面是一个将JSON反序列化为几乎完全空的类结构并启用上述设置的演示:

问题已解决:

示例JSON返回值在通过JSON2Charp转换器(或其他转换器)输入时返回公共类:

            public class Root
        {
            public List<Item> Item { get; set; }
            public int TotalResults { get; set; }
        }
公共类根目录
{
公共列表项{get;set;}
公共整数TotalResults{get;set;}
}
对deseriazeObject的调用需要一个.Root,如中所示:

var data = Newtonsoft.Json.JsonConvert.DeserializeObject<DataClass.PurchaseOrderResponse.Root>(content, settings);
var data=Newtonsoft.Json.JsonConvert.DeserializeObject(内容、设置);

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

请分享你的json字符串和模型。我无法发布API返回的json字符串。太长了。如果Newtonsoft无法“反序列化”某些数据,是否有办法捕获它发现无法做到的内容?有一些方法,但首先我需要您的模型结构Brian感谢您的编辑。读起来更好。非常感谢您丢失了MemberHandling代码。这就成功了!!!我可以让供应商知道他们的API结果有什么问题。我在他们的API返回中发现了其他几个错误。现在他们要改正了。再一次。谢克诺问题;很高兴我能帮忙。
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<DataClass.PurchaseOrderResponse.Root>(content, settings);