web-dev-qa-db-ja.com

NewtonsoftのJSONシリアライザーからJSON DateTimeを解析する

NewtonsoftのJSONシリアライザーを使用してオブジェクトをシリアル化しましたが、DateTimeは次のようになりました。

/Date(1237588418563+0000)/

その上で$ .evalJSON()を実行すると、オブジェクトになりますが、toUTCStringのような通常のDateメソッドは見つかりません。

これでできることはありますか?

37
tags2k

Json.NETに付属のJsonConvertersのいずれかを使用して、日付を操作してより良い形式を取得します。 JavaScriptDateTimeConverterは自動的に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"}    
}

ドキュメント: Json.NETでJSONの日付をシリアル化する

78

私は、ある人にとっては役に立つかもしれない別のアプローチを思いつきました。基本的に、独自のCustomDateConverterを作成し、必要なときに呼び出します。コンバーターは2つのパラメーター、日付形式、たとえばyyyy-MM-dd HH:mm:ssおよびTimeZoneInfo。これにより、日付をUTCからユーザーのタイムゾーンに変換できます。

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();
    }

次のように使用できます。

 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) } });

カスタムの日付フォーマットのみが必要な場合は、明らかにタイムゾーンに関連するものをすべて削除できます。助けたことを教えてください!

16
Johann

Newtonsoft Json.Netバージョン4.5r5では、JsonPropertyAttributeクラスクラスを使用して、そのItemConverterTypeプロパティプロパティを設定します。使用法:

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

私が観察したように、これは、宣言される前のものだけでなく、このクラスのすべてのプロパティにDateTimeConverterを設定します。

15
Anderson

同じ問題にぶつかり、Adamからのリンクに基づいた解決策を見つけました。

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

これは、Unicodeのタイムスタンプのように見えます。javascriptは、これを日付オブジェクトに簡単に変換できます。 - 0は、javascriptがsubstr出力を整数として扱うようにすることです... Number()も、- 0

2
peirix

JSONオブジェクトには次のようなものが含まれていました。

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)));

ただし、eval()やwindow []のようなものを使用せずに日付関数が起動するように、JSONオブジェクトを修正することをお勧めします。たぶんjQueryで。わからない。

オフセットは+であり、オフセットの-である可能性があることを忘れないでください!

1
PowerSparks