Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化并忽略引发异常的属性_C#_Json_Asp.net Mvc - Fatal编程技术网

C# 序列化并忽略引发异常的属性

C# 序列化并忽略引发异常的属性,c#,json,asp.net-mvc,C#,Json,Asp.net Mvc,假设我有一门课: public class Cat { public int Hunger {get; set;} public int Sleepiness {get; set;} public int Usefullness { get { throw new DivideByZeroException(); } } } 是否可以按以下方式对其进行序列化: public ActionResult GetMyCat() { Cat c =

假设我有一门课:

public class Cat
{
    public int Hunger {get; set;}
    public int Sleepiness {get; set;}
    public int Usefullness {
      get { throw new DivideByZeroException(); }
    }
}
是否可以按以下方式对其进行序列化:

public ActionResult GetMyCat()
{
     Cat c = new Cat()
    {
        Hunger = 10,
        Sleepiness = 10
    };

    return Json(c);
}

我不能修改“Cat”类。我可以让MVC JSON序列化程序忽略某个属性抛出的错误(如果它抛出了错误)并为该属性提供一个空/默认值吗?

您可以使用外部JSON序列化库(如)并添加自定义属性来跳过该值。或者添加一个try-catch,在陷阱弹出时获取值并忽略它。

创建将返回正确对象的类扩展

public static class CatExtensions
 {
        public static object GetObject(this Cat value)
        {
            return new
            {
                Hunger = value.Hunger,
                Sleepiness = value.Sleepiness
            }
        }
    }

好吧,这很难看,但有一种方法:

Cat c = new Cat()
{
    Hunger = 10,
    Sleepiness = 10
};

dynamic dynamicCat = new ExpandoObject();
IDictionary<string, object> dynamicCatExpando = dynamicCat;

Type type = c.GetType();
PropertyInfo[] properties = type.GetProperties();

foreach (PropertyInfo property in properties)
{
    try
    {
        dynamicCatExpando.Add(property.Name, property.GetValue(c, null));
    }
    catch (Exception)
    {
       //Or just don't add the property here. Your call.
        object defaultValue = type.IsValueType ? Activator.CreateInstance(type) : null;
        dynamicCatExpando.Add(property.Name, defaultValue); //I still need to figure out how to get the default value if it's a primitive type.
    }
}

return Content(JsonConvert.SerializeObject(dynamicCatExpando), "application/Json");
Cat c=新的Cat()
{
饥饿=10,
嗜睡=10
};
dynamic dynamicCat=new expandooobject();
IDictionary dynamiccatextpando=dynamicCat;
Type Type=c.GetType();
PropertyInfo[]properties=type.GetProperties();
foreach(属性中的PropertyInfo属性)
{
尝试
{
dynamicatexpando.Add(property.Name,property.GetValue(c,null));
}
捕获(例外)
{
//或者不要在这里添加属性。你的电话。
object defaultValue=type.IsValueType?Activator.CreateInstance(类型):null;
dynamiccatextpando.Add(property.Name,defaultValue);//如果它是一个基元类型,我仍然需要弄清楚如何获取默认值。
}
}
返回内容(JsonConvert.SerializeObject(dynamicCatextPando),“application/Json”);

您必须使用内置的JSON序列化程序吗?问题是,我正在处理具有数百个属性的大型poco类。我不会说有,但我不想为这些类编写序列化程序,除非它是动态的。是否可以向属性添加属性?如果是这样,您可以尝试,
[JsonIgnore]
不,但是还有其他序列化程序做得更好,比如JSON.NET,可以处理这种情况。无需自己编写。您是否错过了
我无法修改Cat类的部分?抱歉,我错过了。尽管您可能仍然可以添加一个
try catch
,以获取值,如果失败,则继续操作。当检索任何成员失败时,序列化过程也将失败,你不能简单地继续工作。你可以自定义/创建你自己的JSON序列化程序,在成员中出现异常时跳过它并在下一个异常时继续处理。我可以用任何方式动态地完成这项工作吗?实际上,你刚刚给了我一个想法。我想我知道如何动态地做到这一点。我要试一试。这会很难看的。你说的动态是什么意思?请分享您的想法:)假设cat类有500万个属性,而您却懒得编写一个巨大的GetObject()函数:P我正在考虑通过反射来检查这些属性。@David,当您使用“动态排除”逻辑时,它会变得很棘手。您如何确定哪些属性保留在新对象中,哪些属性不应保留在新对象中?个人观点,如果你采用“新对象方法”,而不是像nomail的例子那样拍摄并手动创建它们,那么从长远来看,这会让你获得控制权(IMHO:)