在另一个类中使用时,如何实现Id类的以下JSON表示形式?
class Car { public StringId Id { get; set; } public string Name { get; set; } } class StringId { public string Value { get; set; } } // --------------------------------------------- // Desired representation { "Id": "someId", "Name": "Ford" } // Default (undesired) representation { "Id" : { "Value": "someId" }, "Name": "Ford" }
你可以添加一个TypeConverter为StringId。Json.NET将选择类型转换器并将其用于将其与字符串进行转换:
TypeConverter
StringId
[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文件在区域性之间可移植。
culture
样品提琴。
但是请注意,如果使用的是.Net Core,则仅从Json.NET 10.0.1开始添加对类型转换器的支持。从10.0.3版本开始,不再支持Json.NET Portable版本中的类型转换器。
另外,如果您不介意向类型中添加特定于Json.NET的属性,则可以使用customJsonConverter:
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); } }
您也可以在全局设置中设置转换器。