c#custom Dictionary <string,string>,它接受用于序列化的重复键

时间:2015-05-20 15:17:50

标签: c# json dictionary

我需要实现一个类似于Dictionary的自定义功能,但可以插入重复的键。因此,基本上我需要从Dictionary中获得将对象序列化为以下JSON的可能性:

{
  "One":"Value 1",
  "Two":"Value x",
  "One":"Value 10",
  "Two":"Value 100"
} 

如您所见,我有重复的密钥......

有什么建议吗? 整点是上面格式的JSON输出

编辑:

KeyValuePair<string,string>不起作用!

这是结果:

[{"Key":"One","Value":"Two"},{"Key":"One","Value":"Two"}]

正如您所看到的那样,序列化为JSON会使Key和Value关键字变为空白,而Dictionary将使用实际键值替换Key,并使用提供的值替换值。

4 个答案:

答案 0 :(得分:8)

您可以使用List<KeyValuePair<TKey, TValue>>代替Dictionary<TKey, TValue>。在您的情况下,它将是List<KeyValuePair<string, string>>

修改

如果您使用Json.NET来序列化JSON,则可以使用自定义转换器实现所需的输出。答案here提供了它(我做了一些修改):

class KeyValuePairConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, 
                                                      JsonSerializer serializer)
    {
        var list = value as List<KeyValuePair<string, string>>;
        writer.WriteStartArray();
        foreach (var item in list)
        {
            writer.WriteStartObject();
            writer.WritePropertyName(item.Key);
            writer.WriteValue(item.Value);
            writer.WriteEndObject();
        }
        writer.WriteEndArray();
    }

    public override object ReadJson(JsonReader reader, Type objectType,
                                                       object existingValue,
                                                       JsonSerializer serializer)
    {
        // TODO...
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(List<KeyValuePair<string, string>>);
    }
}

答案 1 :(得分:2)

您可能想要使用List<Tuple<string,string>>

 List<Tuple<string, string>> values = new List<Tuple<string, string>>();
 values.Add(new Tuple<string, string>("One", "Value 1"));
 values.Add(new Tuple<string, string>("Two", "Value x"));
 values.Add(new Tuple<string, string>("One", "Value 10"));

编辑:如果属性名称很重要,为什么不简单地尝试以下内容:List<MyClass>

class MyClass
{
    public string Key { get; set; }

    public string Value { get; set; }
}

答案 2 :(得分:0)

使用自定义类的数组。

MyClass[] array;

public class MyClass
{
    public string Key { get; set; }
    public string Value { get; set; }
}

答案 3 :(得分:0)

你可以做这样的事情(在控制台中快速敲掉它),但是应该足够明白......

using System.IO;
using System;
using System.Text;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
         List<Tuple<string, string>> values = new List<Tuple<string, string>>();
         values.Add(new Tuple<string, string>("One", "Value 1"));
         values.Add(new Tuple<string, string>("Two", "Value x"));
         values.Add(new Tuple<string, string>("One", "Value 10"));
         Console.Write(Format.ToJson(values));
    }
}

static class Format {
    public static string ToJson(List<Tuple<string, string>> values) {
        StringBuilder builder = new StringBuilder();
        foreach(var item in values) {
            builder.Append(string.Format("{{{0}:{1}}},", item.Item1, item.Item2));
        }
        return "{" + builder.ToString() + "}";
    }
}