我有一个看起来像这样的类:
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
, 我不能再投 value
至 MyData
因为我不知道类型参数,所以那时一切都几乎崩溃了。
我可以为每种类型组合创建单独的类(所以一个用于 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/