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