4

I get data from an API which looks like this:

{
    created_utc: 1442108087,
    body: "test"
}

And here is my Strongly-typed class that I use for deserialization:

public class Comment
{
    [JsonProperty("created_utc")]
    public DateTime CreatedUtc { get; set; }

    [JsonProperty("body")]
    public string Body { get; set; }
}

Using Json.Net how I can resolve this created_utc property, which is in JS Number format to DateTime in UTC in C#?

Uwe Keim
  • 39,551
  • 56
  • 175
  • 291
hyde
  • 2,525
  • 4
  • 27
  • 49

1 Answers1

4

You can try this

[JsonProperty("created_utc")]
[JsonConverter(typeof(UTCDateTimeConverter))]
public DateTime CreatedUtc { get; set; }

public class UTCDateTimeConverter : JsonConverter
{
    public override object ReadJson(
        JsonReader reader,
        Type objectType,
        object existingValue,
        JsonSerializer serializer)
    {
        long ts = serializer.Deserialize<long>(reader);

        return TimeUtils.GetMbtaDateTime(ts);
    }

    public override  bool CanConvert(Type type)
    {
        return typeof(DateTime).IsAssignableFrom(type);
    }

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

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

Another Approach which might be more easier to me

[JsonProperty(ItemConverterType = typeof(UTCDateTimeConverter))]
public DateTime CreatedUtc { get; set; }

var AllComments = JsonConvert.DeserializeObject<Comment>(json, new UTCDateTimeConverter());

public class UTCDateTimeConverter : Newtonsoft.Json.JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddSeconds((long)reader.Value);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
hyde
  • 2,525
  • 4
  • 27
  • 49
Mohit S
  • 13,723
  • 6
  • 34
  • 69
  • 2
    I have added a fix to your second approach. The problem was that you were improperly converting to Int64 and AddMilliseconds should have been AddSeconds – hyde Sep 17 '15 at 03:56