我使用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 ();
希望有所帮助