我正在使用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}}
谢谢大家的答案
答案 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();
希望它有所帮助