序列化-C#数据类型
我有一个我希望序列化为JSON的对象,但是我希望每个属性都有其关联的值,而不是每个属性都有其关联的类型 例如,我有以下课程:序列化-C#数据类型,c#,json,serialization,C#,Json,Serialization,我有一个我希望序列化为JSON的对象,但是我希望每个属性都有其关联的值,而不是每个属性都有其关联的类型 例如,我有以下课程: public class Student { public string Name { get; set; } public int Age { get; set; } public DateTime? DateOfBirth { get; set; } public bool IsMarried { get; set; } } 我希望得
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
public DateTime? DateOfBirth { get; set; }
public bool IsMarried { get; set; }
}
我希望得到的JSON如下所示
{
"Student:" {
"Name": "String",
"Age": "Int",
"DateOfBirth": "DateTime",
"IsMarried": "Boolean"
}
}
有没有一种方法可以设置一个JsonSerializer
来序列化每个属性的类型
,而不是它的值
?使用answer中的信息来构建一个自定义的JsonSerializer
,您可以修改WriteJson
方法来指定要写入的信息
构建自定义的JsonSerializer
需要创建一个新类并从JsonSerializer
派生它,然后覆盖您感兴趣的任何自定义方法
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
serializer.Serialize(writer, null);
return;
}
var properties = value.GetType().GetProperties();
writer.WriteStartObject();
foreach (var property in properties)
{
// Write the property name
writer.WritePropertyName(property.Name);
// Get the value of the property and get the type
serializer.Serialize(writer, property.GetValue(value, null).GetType());
}
writer.WriteEndObject();
}
通过修改的答案,我能够创建一个自定义的JsonConverter
,以处理将属性类型写入JSON的问题
public class CustomConverter : JsonConverter
{
private readonly Type[] _types;
public CustomConverter(params Type[] types)
{
_types = types;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
{
serializer.Serialize(writer, null);
return;
}
var properties = value.GetType().GetProperties();
writer.WriteStartObject();
foreach (var property in properties)
{
// Write the property name
writer.WritePropertyName(property.Name);
// Get the property type name of the property
serializer.Serialize(writer, property.PropertyType.Name);
}
writer.WriteEndObject();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return _types.Any(t => t == objectType);
}
}
使用我的另一个自定义类,每个属性都是字符串,在尝试转换该类的新实例时,每个属性值都是null
,因此调用property.GetValue(value,null).GetType()
会抛出NullReferenceException
正因为如此,我用
property.PropertyType.Name
替换了那行代码,这非常有效 你在找一个好的工作吗!直到现在才知道PropertyName
的存在,找到它真是太棒了!writer.WriteStartObject()
和writer.WriteEndObject()
行是用来做什么的?好吧,它们把开头的指示符写入{
,结尾的指示符写入JsonWriter
。