【问题标题】:Serializing Dictionary<string,string> to array of "name": "value"将 Dictionary<string,string> 序列化为“name”数组:“value”
【发布时间】:2017-03-08 12:34:04
【问题描述】:

我在 ASP.NET WebAPI 2 应用程序中有这个简单的模型:

public class Model {
    public int ID { get; set; }
    public Dictionary<string, string> Dic { get; set; }
}

当它被序列化时,输出是:

{
    "ID": 0,
    "Dic": {
        "name1": "value1",
        "name2": "value2"
    }
}

我搜索了这个问题,但似乎大多数人都需要这个序列化:

{
    "ID": 0,
    "Dic": [{
        "Key": "name1",
        "Value": "value1"
    }]
}

所有解决方案都解决了这种序列化。但我正在寻找的是将字典序列化为这种格式:

{
    "ID": 0,
    "Dic": [{
        "name1": "value1"
    }, {
        "name2": "value2"
    }]
}

换句话说,我想将它序列化为一个对象数组,每个对象包含一对"name1": "value1"。有没有办法做到这一点?或者我应该寻找另一种类型?

【问题讨论】:

  • json 中的数组不能有键。您应该改用对象(哈希)。
  • 对不起,您的 json 无效。您可以在任何在线 json 验证器上检查它
  • 请查看更新

标签: c# serialization json.net asp.net-web-api2


【解决方案1】:

您可以使用自定义 JsonConverter 来获取您正在寻找的 JSON。这是转换器所需的代码:

public class CustomDictionaryConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(IDictionary).IsAssignableFrom(objectType);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        IDictionary dict = (IDictionary)value;
        JArray array = new JArray();
        foreach (DictionaryEntry kvp in dict)
        {
            JObject obj = new JObject();
            obj.Add(kvp.Key.ToString(), kvp.Value != null ? JToken.FromObject(kvp.Value, serializer) : new JValue((string)null));
            array.Add(obj);
        }
        array.WriteTo(writer);
    }

    public override bool CanRead
    {
        get { return false; }
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

要使用转换器,请在模型类中使用 [JsonConverter] 属性标记字典,如下所示:

public class Model 
{
    public int ID { get; set; }
    [JsonConverter(typeof(CustomDictionaryConverter))]
    public Dictionary<string, string> Dic { get; set; }
}

演示小提琴:https://dotnetfiddle.net/320LmU

【讨论】:

    猜你喜欢
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多