Domanda

Ho serializzato un oggetto utilizzando JSON serializzatore di Newtonsoft, e il DateTime ha attraversato come:

/Date(1237588418563+0000)/

Quando ho $ .evalJSON () su questo, si tratta di un oggetto, ma non riesco a trovare nessuna normali metodi di Data come toUTCString su di esso.

Tutte le idee che cosa posso fare con questo?

È stato utile?

Soluzione

Utilizzare uno dei JsonConverters che vengono con Json.NET per lavorare con le date per ottenere un formato migliore. JavaScriptDateTimeConverter automaticamente vi darà una data JavaScript.

public class LogEntry    
{    
  public string Details { get; set; }    
  public DateTime LogDate { get; set; }
}

[Test]
public void WriteJsonDates()
{    
  LogEntry entry = new LogEntry    
  {    
    LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),    
    Details = "Application started."    
  };    


  string defaultJson = JsonConvert.SerializeObject(entry);    
  // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}     

  string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());    
  // {"Details":"Application started.","LogDate":new Date(1234656000000)}

  string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());    
  // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}    
}

Documentazione: Date Serializzazione in JSON con Json.NET

Altri suggerimenti

mi si avvicinò con un approccio diverso, che potrebbe essere utile per alcuni. Fondamentalmente io creo la mia CustomDateConverter che io chiamo quando ne ho bisogno. Il convertitore prende 2 parametri, un formato di data esempio yyyy-MM-dd HH:mm:ss e un TimeZoneInfo, che mi permette di convertire la data da UTC in ora orario dell'utente:

public class JSONCustomDateConverter : DateTimeConverterBase
{
    private TimeZoneInfo _timeZoneInfo;
    private string _dateFormat;

    public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo)
    {
        _dateFormat = dateFormat;
        _timeZoneInfo = timeZoneInfo;
    }
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat));
        writer.Flush();
    }

Si può usare in questo modo:

 var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } });

Ovviamente è possibile rimuovere tutto ciò che riguarda il fuso orario se desideri solo la formattazione di date personalizzato. Fatemi sapere è che ha aiutato!

Come di Newtonsoft Json.Net versione 4.5r5 si utilizza la classe JsonPropertyAttribute Classe e impostare la proprietà ItemConverterType Proprietà. Uso:

// class to be serialized
public class MyClass
{
    [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))]
    public DateTime? DateTime1;
    public DateTime? DateTime2;
}

Come ho osservato questo imposterà il DateTimeConverter per tutte le proprietà di questa classe non solo quello davanti al quale viene dichiarata.

incontrato lo stesso problema, e hanno trovato una soluzione basata sul collegamento da Adamo:

new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0));

Si presenta come un timestamp Unix, che javascript è facilmente in grado di convertire in un oggetto data. Il - 0 è semplicemente quello di rendere javascript trattare il substr uscita come un intero ... Credo che si potrebbe Number() esso pure, se non ti piace l'aspetto di <=>

L'oggetto JSON conteneva qualcosa di simile:

var data = {"CreatedDate":"/Date(1327572000000-1000)/"});

 ///
var oddDateTimeZone = data.CreatedDate;
var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13);
var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4);
var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone)));

, ma, comunque sarebbe meglio fissare l'oggetto JSON per cui la funzione di data licenziato senza usare qualcosa di simile a eval () o la finestra []. Forse in jQuery. Non è sicuro.

Non dimenticate che l'offset potrebbe essere + e non solo - per l'offset!

Mi dispiace semplificare un @James Newton-King bit

string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);    
ObjectMapper mapper = new ObjectMapper();

mapper.registerModule(new JavaTimeModule());

mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

Questo funziona per me

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top