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

标签 c# .net json.net

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

{
  "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/

相关文章:

c# - LINQ to JSON - 来自动态嵌套数组的设置列表

c# - 如何触发静态构造函数

c# - 将值添加到动态填充的列表 c#

c# - Mono 不写入设置默认值

c# - 将 JSON 对象写入 Windows Phone 隔离存储

c# - 如何让 Json.NET 将空 XML 元素序列化为空字符串

c# - WPF窗口类销毁

c# - 即使我添加了AllowLoadLocalInfile,该MySQL版本也不允许使用该命令

c# - 获取 List<T> 中最常见的项目并在之后排序

.net - System.Xml.Linq.XDocument' 在未引用的程序集中定义