是否有一种方法可以在序列化时自动初始化空子对象



我使用json.net序列化我对客户端的响应我正在构建一个控制器动作(在mvc中),从对象类型产生json字符串

所以它看起来像这样:

string json = JsonConvert.SerializeObject(Activator.CreateInstance(type));

我的问题是,当一个对象里面有一个对象(复杂类型),激活器赋空给它,然后,Json序列化器根本不序列化它

例如


如果我的对象类看起来像这样:

public class Phone
{
    public string Name {get; set;}
    public Model Model {get; set;}
}
public class Model
{
    public string Name {get; set;}
    public string IMEI {get; set;}
}

json字符串将是:

{"Name":null, "Model":null}

那么有没有办法使be:

{"Name":null, "Model":{"Name":null, "IMEI":null}}

谢谢大家的回答

OK
我花了一些时间来写这个答案(堆栈溢出限制),但我发现了一个很好的方法来做反射和递归
我已经创建了这个方法:

public void CreateFullInstance(object obj)
{
    PropertyInfo[] properties = obj.GetType().GetProperties();
    foreach(var property in properties)
    {
        Type propertyType = property.PropertyType;
        if(!propertyType.IsPrimitive && 
        propertyType.GetConstructor(Type.EmptyTypes) != null)
        {
            var val = Activator.CreateInstance(propertyType);
            property.SetValue(obj,val);
            CreateFullInstance(val);
        }
    }
}
当我调用

时,我只传递我的首字母:

var phone = Activator.CreateInstance(propertyType);
CreateFullInstance(phone);
var json = JsonConvert.SerializeObject(phone);

这个方法的缺点是没有空构造函数的对象将被忽略。我想我可以解决这个问题但是正如我所说,这些是POCO模型所以它们都有空的构造函数

你需要在Phone对象的构造函数中初始化Model。

public class Phone
{
    public Phone()
    {
        Model = new Model();
    }
    public string Name {get; set;}
    public Model Model {get; set;}
}
public class Model
{
    public string Name {get; set;}
    public string IMEI {get; set;}
}

您也可以使用Activator。CreateInstance重载,通过它可以将值作为参数传递给类型的构造函数。

使用Activator你正在创建主类的对象,这就是为什么在序列化json字符串包含类的属性条目后…{" Name ":空,"模式":零}

现在,如果你想在json字符串模型类属性的属性名,然后做一些事情,因为你的内部类被初始化…

我们可以通过两种方式实现

1)在Phone类的构造函数中初始化Model类。

public class Phone
{
    public Phone()
    {
        Model = new Model();
    }
    public string Name {get; set;}
    public Model Model {get; set;}
}

2)MyClassObject = (MyClassObject)Activator.CreateInstance(type);obj。模型= new ();

希望有所帮助

相关内容

  • 没有找到相关文章

最新更新