C# JSON序列化列表<;KeyValuePair<;字符串,对象>&燃气轮机;

C# JSON序列化列表<;KeyValuePair<;字符串,对象>&燃气轮机;,c#,json,serialization,C#,Json,Serialization,我在一个Web API项目中使用了一个字典,它的序列化方式与JSON中的类似: {"keyname":{objectvalue},"keyname2:".... 由于我有重复的键,我不能再使用字典类型了,现在我使用的是List. 但这是串行化的方式: [{"Key":"keyname","Value":"objectvalue"}... 有没有办法让列表像字典一样序列化 谢谢。如果您使用该库,您可以执行以下操作 定义一个转换器,以按所需方式写入键/值对列表: class MyConverte

我在一个Web API项目中使用了一个字典,它的序列化方式与JSON中的类似:

{"keyname":{objectvalue},"keyname2:"....
由于我有重复的键,我不能再使用字典类型了,现在我使用的是
List.

但这是串行化的方式:

[{"Key":"keyname","Value":"objectvalue"}...
有没有办法让
列表像字典一样序列化

谢谢。

如果您使用该库,您可以执行以下操作

定义一个转换器,以按所需方式写入键/值对列表:

class MyConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        List<KeyValuePair<string, object>> list = value as List<KeyValuePair<string, object>>;
        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, object>>);
    }
}
类MyConverter:JsonConverter
{
公共重写void WriteJson(JsonWriter编写器、对象值、JsonSerializer序列化器)
{
列表=作为列表的值;
writer.writestarray();
foreach(列表中的变量项)
{
writer.WriteStartObject();
writer.WritePropertyName(item.Key);
writer.WriteValue(item.Value);
writer.WriteEndObject();
}
writer.WriteEndArray();
}
公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
{
//待办事项。。。
}
公共覆盖布尔CanConvert(类型objectType)
{
返回objectType==typeof(列表);
}
}
然后使用转换器:

var keyValuePairs = new List<KeyValuePair<string, object>>
                    {
                        new KeyValuePair<string, object>("one", 1),
                        new KeyValuePair<string, object>("two", 2),
                        new KeyValuePair<string, object>("three", 3)
                    };

JsonSerializerSettings settings = new JsonSerializerSettings { Converters = new [] {new MyConverter()} };
string json = JsonConvert.SerializeObject(keyValuePairs, settings);
var keyValuePairs=新列表
{
新的KeyValuePair(“一”,1),
新的KeyValuePair(“两个”,2),
新的KeyValuePair(“三”,3)
};
JsonSerializerSettings=new JsonSerializerSettings{Converters=new[]{new MyConverter()};
string json=JsonConvert.SerializeObject(keyValuePairs,设置);

这将生成
[{“一”:1}、{“二”:2}、{“三”:3}]

如果您有重复的密钥,no.@user250773:请提供代码和输出。。因此,我们可以尝试帮助您。可能重复的ReadJson方法是否也有一个简单的示例?在使用以下格式将字典的反序列化更改为列表时,我遇到了类似的问题:{“key1”:“test”,“key1”:“12345678”,“key2”:“ABC”}@user250773应该有足够的信息让您到达那里。有关信息,如果您想使用
IEnumerable
,可以在方法中使用:CanConvert(Type类型){
return GetType(objectType)==typeof(KeyValuePair);
}其中GetType
静态类型GetType(Type Type){foreach(Type.GetInterfaces()中的intType类型){if(intType.IsGenericType&&intType.GetGenericTypeDefinition()==typeof(IEnumerable)){return intType.GetGenericArguments()[0];}}}return null;}
voilía ReadJson应该像什么样被覆盖?