如何使用Newtonsoft.Json在反序列化时忽略类型



我正在尝试反序列化我必须对我拥有的模型类进行的 json 数据

杰森 :

"{'test':'1339886'}"

类:

public class NewtonTest
    {
        public Element test { get; set; }
    }
public class Element
    {
        public string sample { get; set; }
    }

在主类中:

//under Main
string jsonData =  "{'test':'1339886'}";
var  = JsonConvert.DeserializeObject<NewtonTest>(jsonData);

错误信息://innner 异常

无法从 System.String 转换或转换为 Test.Element。

完全知道错误在我json中传递string时的状态,而在类中我有一个class类型(发生不匹配)。

在这种情况下,我需要处理错误,如果输出不匹配,可能会放置一个 null,但它不应该抛出异常。

我尽力通过设置阅读文档和设置选项,但似乎都不起作用.

我正在使用 Newtonsoft.Json 的 4.5 版

您可以告诉 JSON.NET 忽略特定成员和类型的错误:

var settings = new JsonSerializerSettings
{
    Error = (sender, args) => 
    {
        if (object.Equals(args.ErrorContext.Member, "test") && 
            args.ErrorContext.OriginalObject.GetType() == typeof(NewtonTest))
        {
            args.ErrorContext.Handled = true;
        }
    }
};
NewtonTest test = JsonConvert.DeserializeObject<NewtonTest>(json, settings);

此代码不会引发异常。设置对象中的Error处理程序将被调用,如果引发异常的成员名为 "test" 并且属于 NewtonTest ,则跳过错误并继续 JSON.NET。

ErrorContext属性还具有您可能希望利用的其他属性,以便仅处理您绝对确定要忽略的错误。

如果您想在使用格式不正确的 json 数据时解决此问题。这是一个有效的简单解决方案。

 public static class NewtonHelpers
{
    internal class NewtonHelper
    {
        public string test { get; set; }
    }
    public static NewtonTest BuildNewton(string jsonData)
    {
        var newtonHelper = JsonConvert.DeserializeObject<NewtonHelper>(jsonData);
        var newtonTest = new NewtonTest { test = { sample = newtonHelper.test } };
        return newtonTest;
    }
}

可以像这样使用

var testdata = "{'test':'1339886'}";
var newNewton = NewtonHelpers.BuildNewton(testdata);

相关内容

  • 没有找到相关文章

最新更新