栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Json.Net:序列化/反序列化属性是一个值,而不是一个对象

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Json.Net:序列化/反序列化属性是一个值,而不是一个对象

你可以添加一个

TypeConverter
StringId
。Json.NET将选择类型转换器并将其用于将其与字符串进行转换:

[TypeConverter(typeof(StringIdConverter))]class StringId{    public string Value { get; set; }}class StringIdConverter : TypeConverter{    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)    {        if (sourceType == typeof(string)) return true;        return base.CanConvertFrom(context, sourceType);    }    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)    {        if (destinationType == typeof(StringId)) return true;        return base.CanConvertTo(context, destinationType);    }    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)    {        if (value is string)        { return new StringId { Value = (string)value };        }        return base.ConvertFrom(context, culture, value);    }    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)    {        if (destinationType == typeof(string) && value is StringId)        { return ((StringId)value).Value;        }        return base.ConvertTo(context, culture, value, destinationType);    }}

如果您的字符串表示形式包含嵌入式数字或日期/时间数据,请确保使用

culture
传入的数据而不是默认的当前区域性来转换该数据。Json.NET将使用正确的区域性(默认情况下为不变区域性)调用转换器,从而确保生成的JSON文件在区域性之间可移植。

样品提琴。

但是请注意,如果使用的是.Net Core,则仅从Json.NET
10.0.1开始
添加对类型转换器的支持。从10.0.3版本开始,不再支持Json.NET
Portable版本中的类型转换器。

另外,如果您不介意向类型中添加特定于Json.NET的属性,则可以使用custom

JsonConverter

[JsonConverter(typeof(StringIdConverter))]class StringId{    public string Value { get; set; }}class StringIdConverter : JsonConverter{    public override bool CanConvert(Type objectType)    {        return objectType == typeof(StringId);    }    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)    {        if (reader.TokenType == JsonToken.Null) return null;        var token = JToken.Load(reader);        return new StringId { Value = (string)token };    }    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)    {        var id = (StringId)value;        writer.Writevalue(id.Value);    }}

您也可以在全局设置中设置转换器。

样品提琴。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/442686.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号