首页 / JSON / c# – 泛型的JSON序列化
c# – 泛型的JSON序列化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 泛型的JSON序列化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2603字,纯文字阅读大概需要4分钟。
内容图文
我有一个看起来像这样的课程:
public class MyData : IList<Tuple<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非泛型,但是我需要弄清楚如何将我的元组集合展平成一个数组(大概是对象[] []现在),这样当我序列化我的数据时看起来像:
[[1,2],[2,3]]
要么:
[["foo":1],["bar":2]]
甚至:
[["foo":"bar"],["what":"ever"]]
关于如何处理它的任何想法?在WriteJson中,我不能再将值转换为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序列化全部内容,希望文章能够帮你解决c# – 泛型的JSON序列化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。