javascript serialize - Puoi dire a JSON.Net di serializzare DateTime come Utc anche se non specificato?




in stringify (3)

Le date nel mio database sono memorizzate come Utc. Ma quando li riprendo con la struttura dell'entità vengono fuori come tipo non specificato.

Quando JSON.Net li serializza, non sono in formato Utc. C'è un modo per dire a JSON.Net di serializzare DateTimes come Utc anche se il loro tipo non è specificato come Utc?


Answers

La risposta sopra funziona totalmente e quindi l'ho usata per creare un attributo per convertire una risposta API da PST a UTC.

Per prima cosa avevo bisogno di creare un JsonConverter

public class UTCDateTimeConverter : Newtonsoft.Json.JsonConverter {
    private TimeZoneInfo pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
    public override bool CanConvert(Type objectType) {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        if (reader.Value == null) return null;
        var pacificTime = DateTime.Parse(reader.Value.ToString());
        return TimeZoneInfo.ConvertTimeToUtc(pacificTime, pacificZone);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc((DateTime) value, pacificZone));
    }
}

Poi ho dovuto applicarlo alle proprietà che dovevano essere convertite

public class Order{
    [JsonConverter(typeof(UTCDateTimeConverter))]
    public DateTime OrderDate {get;set;}
}

Imposta DateTimeZoneHandling su JsonSerializerSettings su Utc . Ciò convertirà tutte le date in UTC prima di serializzarle.

public void SerializeObjectDateTimeZoneHandling()
{
  string json = JsonConvert.SerializeObject(
    new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified),
    new JsonSerializerSettings
    {
      DateTimeZoneHandling = DateTimeZoneHandling.Utc
    });

  Assert.AreEqual(@"""2000-01-01T01:01:01Z""", json);
}

Documentazione: impostazione DateTimeZoneHandling


La mia soluzione era semplicemente rimuovere il riferimento principale sulle mie entità figlio.

Quindi, nel mio modello, ho selezionato la relazione e modificato il riferimento padre in Internal anziché in Public.

Potrebbe non essere una soluzione ideale per tutti, ma ha funzionato per me.





javascript asp.net entity-framework json.net