gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:05:43 24 4
gpt4 key购买 nike

在另一个类中使用时,如何实现 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(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 而不是默认的当前 culture 来转换该数据。 Json.NET 将调用具有正确文化的转换器,which is the invariant culture by default ,从而确保生成的 JSON 文件可以在不同文化之间移植。

样本 fiddle .

但是请注意,如果您使用的是 .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);
}
}

您还可以在 global settings 中设置转换器.

样本 fiddle .

关于c# - Json.Net:将属性序列化/反序列化为一个值,而不是一个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40480489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com