简体   繁体   English

JSON序列化列表 <KeyValuePair<string, object> &gt;

[英]JSON Serialize List<KeyValuePair<string, object>>

I used a Dictionary in a Web API project, which is serializing like that in JSON: 我在Web API项目中使用了Dictionary,该项目的序列化方式类似于JSON:

{"keyname":{objectvalue},"keyname2:"....

Since I have duplicate keys I could't use Dictionary type any more, and instead now I'm using List<KeyValuePair<string,object>>. 因为我有重复的键,所以我不能再使用Dictionary类型,而是现在使用List<KeyValuePair<string,object>>.

But this is serializing that way: 但这是以这种方式序列化的:

[{"Key":"keyname","Value":"objectvalue"}...

Is there a way to have the List<KeyValuePair> serialize the same way a dictionary does? 有没有办法像字典一样序列化List<KeyValuePair>

Thanks. 谢谢。

If you use the Newtonsoft Json.NET library you can do the following. 如果您使用Newtonsoft Json.NET库,则可以执行以下操作。

Define a converter to write the list of key/value pairs the way you want: 定义一个转换器,以所需的方式写入键/值对的列表:

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>>);
    }
}

Then use the converter: 然后使用转换器:

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);

This generates [{"one":1},{"two":2},{"three":3}] 这将生成[{"one":1},{"two":2},{"three":3}]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM