【问题标题】:How to ignore type while Deserialization using Newtonsoft.Json如何在使用 Newtonsoft.Json 进行反序列化时忽略类型
【发布时间】:2015-06-17 21:33:51
【问题描述】:

我正在尝试反序列化我必须针对我拥有的模型类的 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。”

当我在json 中传递string 时,我完全知道错误状态是什么,而在课堂上我有一个class 作为类型(发生不匹配)。

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

我已尽力通过settings 阅读文档和设置选项,但似乎没有任何效果。

我使用的是 Newtonsoft.Json 4.5 版

【问题讨论】:

  • 比用try/catch包围代码;捕获确切的异常;并对对象做任何你想做的事情。
  • 您可能需要查看 Custom Conversion 或通过使用 JsonConvert.DeserializeObject&lt;dynamic&gt;(jsonData); 来利用动态,然后执行另一个过程将该动态转换为完全限定的对象(在您的情况下为 NewtonTest)。
  • 您的类结构与您的 JSON 不匹配。为什么不创建有效的 JSON?
  • 如果您的 json 数据匹配,它将正常工作。 var jsonData = "{\"test\": {\"sample\": \"1339886\"}}";
  • 是的,如果 json 数据完全匹配,一切都会正常工作。但是有可能出现这样的数据,我应该处理它,这就是这种情况。可能是 100 次中的 1 次。我不应该让它碰运气,json数据来自用户上传

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


【解决方案1】:

可以告诉 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 属性还有其他属性,您可能希望利用这些属性仅处理您绝对确定要忽略的错误。

【讨论】:

  • 像金粉一样工作。艰难我删除了if 条件以满足我的模型结构。我希望删除条件以后不会引起任何问题。谢谢一百万:)
  • 这可能使用 System.Text.Json 吗?
【解决方案2】:

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

【讨论】:

  • 感谢您的尝试。我的情况是一个非常罕见的情况,但我应该能够处理它而不是修改模型(类)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多