5

与 BCL 的 DateTime 相比,我正在制作 NodaTime 的原型项目,但执行此结果会给我 recursionLimit 超出错误。

超出递归限制

这是我用来 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;
}

我确信 NodaTime 对象没有正确序列化,因为当我从 viewModel 注释代码时,JsonResult 能够执行。

我从这个页面上读到了这个NodaTime API Reference

此命名空间中的代码当前不包含在 Noda Time NuGet 包中;它仍然被认为是“实验性的”。要使用这些序列化程序,请从项目主页下载并构建 Noda Time 源代码。

所以我下载并构建了源代码并替换了我的项目引用的 dll,但我不知道如何实现 JsonSerialization 类。

有人可以向我解释如何使用 NodaTime.Serialization.JsonNet 类使我的 NodaTime 对象可序列化吗?

4

2 回答 2

11

我们目前不支持JavaScriptSerializer:我怀疑您必须使用Json.NET进行所有JSON 序列化。有关序列化的用户指南页面提供了更多信息,但它主要假设您已经了解 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

然后配置您的序列化程序设置以使用它。这不适用于默认的序列化器/反序列化器- 您需要明确配置一个。

我们选择静态使用一个。您的用法可能会有所不同。这是一个例子:

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 回答