1

次のシリアル化コードを使用する Nancy JSON REST サービスがあります...

FormatterExtensions.AsJson(this.Response, insightManager.CaseSummary(x.caseId));

その後、デシリアライズされます...

    public static T ParseResponseForObject<T>(string response)
    {
        var javaScriptSerializer = new JavaScriptSerializer();
        try
        {
            return javaScriptSerializer.Deserialize<T>(response);
        }
        catch (Exception ex)
        {
            throw new Exception(response, ex);
        }
    }

そして、insightManager.CaseSummary(x.caseId) コードは、null 許容の DateTime を含むクラスのインスタンスを返します。

問題は、シリアル化/逆シリアル化プロセスで日付が 1 時間失われることです。これは、ある種の UTC オフセットであると思います。とにかく日付部分だけが欲しいので、これはちょっと面倒です。そのため、すべての日付が実際よりも前の日のように見えます。

javascriptでtisを修正する投稿をたくさん見てきましたが、コードの両方の部分が「標準」のセリレーザーを使用している場合にそれらを適用する方法がわかりません。

4

1 に答える 1

1

だから、私は最終的に答えを見つけました。基本的に、必要な結果を確実に得るために、日付が逆シリアル化された後に .ToLocalTime() を呼び出す必要があります。理由の非常に良い説明http://www.west-wind.com/weblog/posts/2008/Sep/03/Watch-out-for-Date-Kind-in-JSON-Deserialization

ただし、要するに、JSON 日付にシリアル化すると、日付は常に UTC 時間に変換されるため、逆シリアル化から返される日付は常に UTC 日付になるため、現地時間に変換する必要があります。

他の誰かがこの問題を抱えている場合に備えてParseResponseForObject<T>、DateTimeまたはDateTimeに常に現地時間を使用するように関数を調整しました...

    public static T ParseResponseForObject<T>(string response)
    {
        var javaScriptSerializer = new JavaScriptSerializer();
        try
        {
            var obj = javaScriptSerializer.Deserialize<T>(response);

            var props = obj
                .GetType()
                .GetProperties(BindingFlags.Instance | BindingFlags.Public);

            foreach (var pi in props)
            {
                if (pi.PropertyType == typeof(DateTime))
                {
                    var origDt = (DateTime)pi.GetValue(obj, null);
                    pi.SetValue(obj, origDt.ToLocalTime(), null);
                }
                else if (pi.PropertyType == typeof(DateTime?))
                {
                    var origDt = (DateTime?)pi.GetValue(obj, null);

                    if (origDt.HasValue)
                    {
                        pi.SetValue(obj, origDt.Value.ToLocalTime(), null);
                    }
                }
            }

            return obj;
        }
        catch (Exception ex)
        {
            throw new Exception(response, ex);
        }
    }
于 2012-05-08T21:47:27.807 に答える