Dav*_*cia 8 c# ienumerable serialization json json.net
一些实现IEnumerable的自定义类型不一定具有后备集合.它们可以动态生成,例如使用'yield'或LINQ.这是一个例子:
public class SOJsonExample
{
public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>>
{
public List<int> Keys { get; set; }
public List<float> Values { get; set; }
public MyCustomEnumerable()
{
Keys = new List<int> { 1, 2, 3 };
Values = new List<float> { 0.1f, 0.2f, 0.3f };
}
public IEnumerator<KeyValuePair<int, float>> GetEnumerator()
{
var kvps =
from key in Keys
from value in Values
select new KeyValuePair<int, float>(key, value);
return kvps.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我发现Json.NET的默认序列化是枚举每个值并将值存储在JavaScript数组中(我不想要).然后,默认的反序列化器将无法反序列化集合,因为它无法填充.在这些情况下,我想要Json.NET跳过默认的JavaScript数组序列化,只需存储类的成员.
我想要的只是我的键和值 - 是否有任何快捷方式可以做到这一点,还是我必须实现自己的自定义序列化器?
检查了这个和这个,这两个都不是我的问题.扫描了文档,但没找到我要找的东西(也许我找错了地方).
(编辑#1 - 提高清晰度)
(编辑#2 - 回答了我自己的问题......见下文)
Dav*_*cia 14
回答了我自己的问题 - 请参阅有关IEnumerable,Lists和Arrays的优秀文档:
.NET列表(从IEnumerable继承的类型)和.NET数组转换为JSON数组.由于JSON数组仅支持一系列值而不支持属性,因此.NET集合上声明的任何其他属性和字段都不会序列化.在不需要JSON数组的情况下,JsonObjectAttribute可以放在实现IEnumerable的.NET类型上,以强制将类型序列化为JSON对象.
所以,对于我的例子:
[JsonObject]
public class MyCustomEnumerable : IEnumerable<KeyValuePair<int,float>>
{
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1267 次 |
| 最近记录: |