c# - 泛型的 JSON 序列化

标签 c# generics serialization json.net

我有一个看起来像这样的类:

public class MyData : IList<Tuple<double,double>>

想法是您有一个值对列表。很简单。但我希望将其序列化,使其看起来像 double 组(即 double[][] )而不是元组列表。序列化后应该是这样的:

[[1,1],[2,2],[3,3]]

所以我创建了一个简单的 JsonConverter那会做的。它有一个非常简单的 WriteJson看起来像这样的方法:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    var obj = value as MyData;
    double[][] dataArray = (from dp in obj._data
                            select new[] { dp.Item1, dp.Item2 }).ToArray();
    var ser = new JsonSerializer();
    ser.Serialize(writer, dataArray);
}

我装饰MyData具有适当的属性:

    [JsonConverter(typeof(MyDataJsonConverter))]
    public class MyData: IList<Tuple<double,double>>

一切正常。但是现在,我想扩展它并制作 MyData通用:

    public class MyData<S,T>: IList<Tuple<S,T>>

这是我遇到的问题。最初,我尝试制作 MyDataJsonConverter也是通用的:

   [JsonConverter(typeof(MyDataJsonConverter<S,T>))]
   public class MyData<S,T>: IList<Tuple<S,T>>

但这是不允许的,因为您不能将泛型与属性一起使用。

所以我必须保留MyDataJsonConverter非泛型,但我需要弄清楚如何将我的元组集合展平为一个数组(现在大概是 object[][]),这样当我序列化我的数据时,它看起来像:

[[1,2],[2,3]]

或:

[["foo":1],["bar":2]]

甚至:

[["foo":"bar"],["what":"ever"]]

关于如何处理它有什么想法吗?在 WriteJson , 我不能再投 valueMyData因为我不知道类型参数,所以那时一切都几乎崩溃了。

我可以为每种类型组合创建单独的类(所以一个用于 Tuple<double,double>,一个用于 Tuple<string,double> 等等......),但我想知道在我进行蛮力之前是否有更好的方法

最佳答案

好的,这基本上就是我最终所做的(以防其他人需要类似的东西)。我的收藏看起来像这样:

    [JsonConverter(typeof(MyDataJsonConverter))]
    public class MyData<S,T> : IList<Tuple<S,T>>
    {
        private List<Tuple<S, T>> _data;
        // all the implementation of IList...
    }

我的自定义转换器(现在不再嵌套在 MyData 中)如下所示:

internal class MyDataJsonConverter : JsonConverter
{

    public override bool CanConvert(Type objectType)
    {
        return objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof(MyData<,>);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        // Note: this is strictly for serializing, deserializing is a whole other
        // ball of wax that I don't currently need!
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var obj = value as IEnumerable<dynamic>;
        object[][] dataArray = (from dp in obj
                                select new object[] { dp.Item1, dp.Item2 }).ToArray();
        var ser = new JsonSerializer();
        ser.Serialize(writer, dataArray);
    }

    public override bool CanRead
    {
        get
        {
            return false;
        }
    }
}

关于c# - 泛型的 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21294697/

相关文章:

c# - 将通用列表项添加到 Winforms 的列表框 c#

java - Lambda 表达式和通用接口(interface)

python - Django REST Framework - 序列化可选字段

c# - 如何从模型列表中的模型分配值

java - 如何从名称中获取任意枚举的实例作为字符串

c# - 在 C#/Silverlight 应用程序中使用反射访问私有(private)方法

c# - 构造函数中的 XML 序列化代码执行顺序 - 重新排序的方式?

python - 覆盖Django RestFramework CreateModelMixin序列化器错误消息

c# - 如何从 C# 中的 mdi 容器窗体的可用空间设置子窗体基数的大小?

c# - DateTime解析复杂字符串C#