序列化-C#数据类型

序列化-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; } } 我希望得

我有一个我希望序列化为JSON的对象,但是我希望每个属性都有其关联的值,而不是每个属性都有其关联的类型

例如,我有以下课程:

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