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"
  }
}