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

时间:2015-06-17 12:32:37

标签: c# asp.net-mvc-4 json.net

我正在尝试反序列化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);

错误信息: //内在异常

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

我完全知道错误在我的string中传递json时的错误状态,因为我在类{i}中有class类型(发生不匹配)。

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

我尽力阅读文档并通过settings设置选项,但似乎都没有。

我使用的是Newtonsoft.Json的4.5版本

2 个答案:

答案 0 :(得分: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继续运行。< / p>

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

答案 1 :(得分:0)

如果你想在使用格式错误的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);