有没有办法在序列化时自动初始化null子对象?

时间:2014-07-10 08:39:45

标签: c# json.net

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

生成一个json字符串

所以它看起来像这样:

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

我的问题是,当一个对象里面有一个对象(复杂类型)时,激活器为它指定null,然后,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}

有没有办法让:

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

谢谢大家的答案

3 个答案:

答案 0 :(得分:2)


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

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模型,所以他们都有空构造函数

答案 1 :(得分:0)

您需要在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重载,您可以通过该重载将值作为参数传递给类型的构造函数。

答案 2 :(得分:0)

使用Activator,您正在创建主类的对象,这就是为什么序列化json字符串后包含类的属性的条目... {" Name":null," Model& #34;:空}

现在如果你想在json字符串中使用Model类属性的属性名,那么odo是因为你的内部类被初始化了...

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

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

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

    public string Name {get; set;}
    public Model Model {get; set;}
}

2) MyClassObject obj =(MyClassObject)Activator.CreateInstance(type); obj.Model = new Model();

希望它有所帮助