使用JSON.Net将JSON数组反序列化为Dictionary

时间:2018-10-10 15:16:20

标签: json json.net

我的JSON的一部分如下所示:

enter image description here

就像您在JSON中看到的那样,温度“字典”实际上是2个元素的列表。

第一个元素是时间戳记,第二个元素是温度。不知道为什么服务提供者这样做了,但是我真的没有选择,我必须这样做。

但是在我的C#对象中,我希望将此作为字典,以时间戳为键,以温度为值。

这可能吗?

//note, I've a custom converter that converts from long to DateTime     
public Dictionary<DateTime, double> Temperature { get; set; }

并反序列化如下:

JsonConvert.DeserializeObject<List<WeatherPredictionDay>>(content, new EpochConverter());

1 个答案:

答案 0 :(得分:0)

是的,这可以通过这样的自定义JsonConverter完成:

class TemperatureArrayConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(Dictionary<DateTime, double>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JArray ja = JArray.Load(reader);
        var dict = new Dictionary<DateTime, double>();
        foreach (JArray item in ja)
        {
            var key = item[0].ToObject<DateTime>(serializer);
            var val = item[1].ToObject<double>(serializer);
            dict.Add(key, val);
        }
        return dict;
    }

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

要使用它,只需将Temperature属性标记为[JsonConverter]属性,如下所示:

[JsonConverter(typeof(TemperatureArrayConverter))]
public Dictionary<DateTime, double> Temperature { get; set; }

注意:以上编写的转换器旨在与您现有的EpochConverter配合使用,以将字典键的时间戳值转换为DateTimes

这是一个有效的演示:https://dotnetfiddle.net/TdxYjj