gpt4 book ai didi

c# - 为 json.net 编写可重用的 JsonConverter

转载 作者:行者123 更新时间:2023-11-30 14:47:36 26 4
gpt4 key购买 nike

我正在查询返回多种格式的标签列表的服务:

{
"tags": "a,b,c"
}

{
"tags": "a b c"
}

{
"tags": "a+b+c"
}

我要反序列化的对象是 List<string> .我写了一个TagsConverterJsonConverter 中实现了必要的方法像这样:

public class TagsConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(string));
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return reader
.Value
.ToString()
.Split(' ')
.ToList();
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var list = (List<string>)value;
var delimitedList = string.Join(" ", list);

writer.WriteValue(delimitedList);
}
}

然后我像这样注释对象中的字段:

public class Foo
{
[JsonConverter(typeof(TagsConverter))]
public List<string> Tags { get; set; }
}

这有效,但仅适用于以空格分隔的标签。

然而 TagsConverter如果我能够更改 Split,则可以在所有 3 种情况下工作和 Join以参数化的方式运行。但是由于我们只将类型传递给 JsonConverter属性,我知道我们不能将“定界符”作为参数传递给那里。

有什么办法可以实现吗?

最佳答案

还有一个额外的JsonConverter constructor overload它采用 类型 params object[] converterParameters 注入(inject)到转换器的具体实例中。您可以利用此重载来最大限度地提高可重用性。

public class TagsConverter : JsonConverter
{
private readonly string _delimiter;

public TagsConverter(string delimiter)
{
_delimiter = delimiter;
}

public override bool CanConvert(Type objectType)
{
return (objectType == typeof(string));
}

public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
return reader
.Value
.ToString()
.Split(_delimiter.ToCharArray())
.ToList();
}

public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
var list = (List<string>)value;
var delimitedList = string.Join(_delimiter, list);

writer.WriteValue(delimitedList);
}
}

使用重载就像将它作为第二个参数传递一样简单:

public class Foo
{
[JsonConverter(typeof(TagsConverter), " ")]
public List<string> Tags { get; set; }
}

关于c# - 为 json.net 编写可重用的 JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44350350/

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