我需要实现一个类似于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,并使用提供的值替换值。
答案 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() + "}";
}
}