C# 序列化时是否有自动初始化空子对象的方法?

C# 序列化时是否有自动初始化空子对象的方法?,c#,json.net,C#,Json.net,我正在使用json.net序列化对客户端的响应 我正在构建一个控制器操作(在mvc中),它从对象类型生成json字符串 看起来是这样的: 我的问题是,当一个对象内部有一个对象(复杂类型)时,activator会将null赋值给它,然后Json序列化程序根本不会序列化它 例如 如果我的对象类如下所示: json字符串将是: 那么,有没有一种方法可以做到: 谢谢大家的回答您需要在Phone对象的构造函数中初始化模型 public class Phone { public Phone(

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

看起来是这样的:

我的问题是,当一个对象内部有一个对象(复杂类型)时,activator会将null赋值给它,然后Json序列化程序根本不会序列化它

例如
如果我的对象类如下所示:

json字符串将是:

那么,有没有一种方法可以做到:


谢谢大家的回答

您需要在Phone对象的构造函数中初始化模型

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”:null,“Model”:null}

现在,如果您希望模型类属性的属性名也出现在json字符串中,那么odo将初始化您的内部类

我们可以通过两种方式实现这一目标

1) 在Phone类的构造函数中,初始化模型类如下

public class Phone
{
    public Phone()
    {
        Model = new Model();
    }

    public string Name {get; set;}
    public Model Model {get; set;}
}
(二) MyClassObject obj=(MyClassObject)Activator.CreateInstance(类型); 对象模型=新模型()

希望它有帮助

好的
我花了一些时间来写这个答案(堆栈溢出限制),但是我发现了一个很好的方法,可以通过反射和递归来实现它
我创建了这个方法:

当我调用它时,我只传递我的首字母:


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

谢谢你的回答,但我有一个限制,我不能控制序列化对象类型(因此我不能修改它并写ctor)等等,这些类都是POCO模型,我只希望它们保持在属性级别(不带系数或方法)
{"Name":null, "Model":null}
{"Name":null, "Model":{"Name":null, "IMEI":null}}
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;}
}
public class Phone
{
    public Phone()
    {
        Model = new Model();
    }

    public string Name {get; set;}
    public Model Model {get; set;}
}
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);