JSON Serialize List< KeyValuePair< string,object>>

svmlkihl  于 2023-07-01  发布在  其他
关注(0)|答案(2)|浏览(73)

我在一个Web API项目中使用了一个Dictionary,它像JSON中那样序列化:

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

由于我有重复的键,我不能再使用Dictionary类型,现在我使用List<KeyValuePair<string,object>>.
但这是序列化的方式:

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

有没有一种方法可以让List<KeyValuePair>像字典一样进行序列化?
谢谢

daolsyd0

daolsyd01#

如果你使用Newtonsoft Json.NET库,你可以做以下事情。
定义一个转换器,以您想要的方式编写键/值对列表:

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

然后使用转换器:

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

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

eivgtgni

eivgtgni2#

我会稍微修改一下公认的答案

public class MyConverter : JsonConverter<List<KeyValuePair<string, object>>>
{
    public override void WriteJson(JsonWriter writer, List<KeyValuePair<string, object>> value, JsonSerializer serializer)
    {
        List<KeyValuePair<string, object>> list = new(value);

        var keys = list.Select(x => x.Key).Distinct();

        writer.WriteStartObject();

        foreach (var key in keys) {
            var values = list.Where(item => item.Key == key).ToList();
            writer.WritePropertyName(values[0].Key);

            if (values.Count() == 1)
            {                    
                writer.WriteValue(values[0].Value);
            }
            else
            {
                writer.WriteStartArray();
                writer.WriteValue(string.Join(", ", values.Select(v => v.Value)));
                writer.WriteEndArray();
            }               
        }
        writer.WriteEndObject();

    }    

    public override List<KeyValuePair<string, object>>? ReadJson(JsonReader reader, Type objectType, List<KeyValuePair<string, object>>? existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

相关问题