5

BCL の DateTime と比較した NodaTime のプロトタイプ プロジェクトを作成していますが、この結果を実行すると recursionLimit exceeded エラーが発生します。

再帰制限を超えました

これは、ビューモデルを JSON 化するために使用している関数です。この関数が戻った後にエラーが発生します。

    [HttpPost]
    public JsonResult GetDates(int numOfDatesToRetrieve)
    {
        List<DateTimeModel> dateTimeModelList = BuildDateTimeModelList(numOfDatesToRetrieve);

        JsonResult result = Json(dateTimeModelList, JsonRequestBehavior.AllowGet);
        return result;
    }

私のビューモデルは、私が調べたときに正しく構築されています。これが私のビューモデルのコードです。

public class DateTimeModel
{
    public int ID;

    public LocalDateTime NodaLocalDateTimeUTC;
    public LocalDateTime NodaLocalDateTime
    {
        get
        {
            DateTimeZone dateTimeZone = DateTimeZoneProviders.Bcl.GetZoneOrNull(BCLTimezoneID);

            //ZonedDateTime zonedDateTime = NodaLocalDateTimeUTC.InUtc().WithZone(dateTimeZone);

            OffsetDateTime offsetDateTime = new OffsetDateTime(NodaLocalDateTimeUTC, Offset.Zero);
            ZonedDateTime zonedDateTime = new ZonedDateTime(offsetDateTime.ToInstant(), dateTimeZone);
            return zonedDateTime.LocalDateTime;
        }
    }

    public OffsetDateTime NodaOffsetDateTime;

    public DateTime BclDateTimeUTC;
    public DateTime BclLocalDateTime
    {
        get
        {
            DateTime utcDateTime = DateTime.SpecifyKind(BclDateTimeUTC, DateTimeKind.Utc);
            TimeZoneInfo nzTimeZone = TimeZoneInfo.FindSystemTimeZoneById(BCLTimezoneID);
            DateTime result = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, nzTimeZone);
            return result;
        }
    }

    public DateTimeOffset BclDateTimeOffset;
    //public int Offset;
    public string OriginalDateString;
    public string BCLTimezoneID;
}

viewModel のコードにコメントを付けると JsonResult を実行できるため、NodaTime オブジェクトが正しくシリアル化されていないと確信しています。

このページからこれを読みましたNodaTime API リファレンス

この名前空間のコードは、現在 Noda Time NuGet パッケージには含まれていません。それはまだ「実験的」とみなされます。これらのシリアライザーを使用するには、プロジェクトのホームページから Noda Time のソース コードをダウンロードしてビルドしてください。

そのため、ソース コードをダウンロードしてビルドし、dll のプロジェクト参照を置き換えましたが、JsonSerialization クラスを実装する方法がわかりません。

NodaTime.Serialization.JsonNet クラスを使用して NodaTime オブジェクトをシリアライズ可能にする方法を誰かに説明してもらえますか?

4

2 に答える 2

11

現在、 のサポートはありません:すべての JSON シリアル化にJson.NETJavaScriptSerializer使用する必要があると思います。シリアライゼーションに関するユーザー ガイド ページにもう少し詳しい情報が記載されていますが、ほとんどの場合、Json.NET について既に知っていることを前提としています。

良いニュースは、Json.NET は非常に使いやすいということです。

var settings = new JsonSerializerSettings();
settings.ConfigureForNodaTime();
string json = JsonConvert.SerializeObject(model, settings);

(または を使用しますJsonSerializer。)

余談ですが、あなたが Noda Time 型を使用している方法は、控えめに言っても少し奇妙です - あなたが達成しようとしていることの詳細について別の質問をする価値があるかもしれません.それを行う方法:)

于 2013-02-12T10:30:40.057 に答える
3

シリアル化は、Noda Time 2.0+ の JSON.NET でサポートされています。

NuGet を使用してパッケージをインストールする必要があります。

> Install-Package NodaTime.Serialization.JsonNet

次に、それを使用するようにシリアライザーの設定を構成します。これは、デフォルトのシリアライザー/デシリアライザーでは機能しません。明示的に構成する必要があります。

1 つを静的に使用することにしました。使い方が異なる場合があります。次に例を示します。

using Newtonsoft.Json;
using NodaTime;
using NodaTime.Serialization.JsonNet; // << Needed for the extension method to appear!
using System;

namespace MyProject
{
    public class MyClass
    {
        private static readonly JsonSerializerSettings _JsonSettings;

        static MyClass()
        {
            _JsonSettings = new JsonSerializerSettings
            {
                // To be honest, I am not sure these are needed for NodaTime,
                // but they are useful for `DateTime` objects in other cases.
                // Be careful copy/pasting these.
                DateFormatHandling = DateFormatHandling.IsoDateFormat,
                DateTimeZoneHandling = DateTimeZoneHandling.Utc,
            };

            // Enable NodaTime serialization
            // See: https://nodatime.org/2.2.x/userguide/serialization
            _JsonSettings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb);
        }

        // The rest of your code...
    }
}
于 2017-10-27T19:27:25.690 に答える