【问题标题】:JSON Serialize List<KeyValuePair<string, object>>JSON 序列化列表<KeyValuePair<string, object>>
【发布时间】:2014-01-09 13:31:08
【问题描述】:

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

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

由于我有重复的键,我不能再使用 Dictionary 类型,而现在我使用的是 List&lt;KeyValuePair&lt;string,object&gt;&gt;.

但这是这样序列化的:

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

有没有办法让List&lt;KeyValuePair&gt; 像字典一样序列化?

谢谢。

【问题讨论】:

标签: c# json serialization


【解决方案1】:

如果您使用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}]

【讨论】:

  • ReadJson 方法的工作原理是否也有一个简单的示例?我在使用以下格式将 Dictionary 的反序列化更改为 List> 时遇到了类似的问题:{"key1":"test", "key1":"12345678", "key2": “ABC”,}
  • @user250773 This blog 应该有足够的信息让你到达那里。
  • 如果你想使用IEnumerable&lt;...&gt;,你可以在方法中使用信息:CanConvert(Type type){return GetType(objectType) == typeof(KeyValuePair&lt;string, object&gt;);} where GetType static Type GetType(Type type) { foreach (Type intType in type.GetInterfaces()) { if (intType.IsGenericType &amp;&amp; intType.GetGenericTypeDefinition() == typeof(IEnumerable&lt;&gt;)) { return intType.GetGenericArguments()[0]; } } return null; }voilà
  • ReadJson 应该像什么一样被覆盖?
猜你喜欢
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多