C# 如何将集合(具有索引器属性)序列化为字典
我有一个类,比如说,C# 如何将集合(具有索引器属性)序列化为字典,c#,json.net,C#,Json.net,我有一个类,比如说,FooCollection,它实现了IEnumerable,还提供了一个索引器,通过它可以按名称查找Foo。从功能上讲,它是一本只读字典。但它并不是真正的字典,因为用户无法决定键 无论如何,我希望JSON.NET将这个对象序列化为一个JSON字典,而不是它现在正在做的数组。将JsonDictionaryAttribute粘贴在上面不起作用:那么它就什么都不起作用了 线索?您可能需要为您的FooCollection类创建一个自定义项,以便以您想要的方式序列化它。由于您根本没有发
FooCollection
,它实现了IEnumerable
,还提供了一个索引器,通过它可以按名称查找Foo
。从功能上讲,它是一本只读字典。但它并不是真正的字典,因为用户无法决定键
无论如何,我希望JSON.NET将这个对象序列化为一个JSON字典,而不是它现在正在做的数组。将JsonDictionaryAttribute
粘贴在上面不起作用:那么它就什么都不起作用了
线索?您可能需要为您的
FooCollection
类创建一个自定义项,以便以您想要的方式序列化它。由于您根本没有发布任何代码,为了示例起见,我将做一些补充。假设您的Foo
和FooCollection
类如下所示:
class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
class FooCollection : IEnumerable<Foo>
{
private List<Foo> list = new List<Foo>();
public void Add(Foo foo)
{
list.Add(foo);
}
public Foo this[string name]
{
get { return list.Find(f => f.Name == name); }
}
public IEnumerator<Foo> GetEnumerator()
{
return list.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable)list).GetEnumerator();
}
}
下面是一个示例程序,演示如何使用转换器
class Program
{
static void Main(string[] args)
{
FooCollection coll = new FooCollection();
coll.Add(new Foo { Id = 1, Name = "Moe" });
coll.Add(new Foo { Id = 2, Name = "Larry" });
coll.Add(new Foo { Id = 3, Name = "Curly" });
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new FooCollectionConverter());
settings.Formatting = Newtonsoft.Json.Formatting.Indented;
string json = JsonConvert.SerializeObject(coll, settings);
Console.WriteLine(json);
}
}
这是上述程序的输出:
{
"Moe": {
"Id": 1,
"Name": "Moe"
},
"Larry": {
"Id": 2,
"Name": "Larry"
},
"Curly": {
"Id": 3,
"Name": "Curly"
}
}
Fiddle:为什么不发布代码而不是描述流程。您可以分享ReadJson方法的示例吗?
{
"Moe": {
"Id": 1,
"Name": "Moe"
},
"Larry": {
"Id": 2,
"Name": "Larry"
},
"Curly": {
"Id": 3,
"Name": "Curly"
}
}