我正在查询返回多种格式的标签列表的服务:
{
"tags": "a,b,c"
}
或
{
"tags": "a b c"
}
或
{
"tags": "a+b+c"
}
我要反序列化的对象是 List<string>
.我写了一个TagsConverter
在 JsonConverter
中实现了必要的方法像这样:
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/