gpt4 book ai didi

c# - json.net: DateTimeStringConverter 在 ReadJson() 中获取一个已经转换为 DateTime 的对象

转载 作者:太空宇宙 更新时间:2023-11-03 12:08:46 25 4
gpt4 key购买 nike

先决条件:

  • JSON.Net 11.0.2

我需要通过基于 JSON 的 REST-API 存储 UTC DateTime 往返日期/时间模式。

string utcTimestamp = DateTime.UtcNow.ToString( "o" );
// 2018-11-27T22:35:32.1234567Z

所以我自己写了一个 DateTimeStringConverter 来确保不涉及本地文化信息。

class DateTimeStringConverter:
JsonConverter<DateTime>
{
public override void WriteJson( JsonWriter writer, DateTime value, JsonSerializer serializer )
{
string convertedValue = value.ToString( "o" );
writer.WriteValue( convertedValue );
}

public override DateTime ReadJson( JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer )
{
string value = reader.Value.ToString( );
DateTime convertedValue = DateTime.Parse( value ).ToLocalTime( );
return convertedValue;
}
}

我很困惑为什么我得到一个没有毫秒的 DateTime 对象。经过大量的反复试验,我进入了它。

public override DateTime ReadJson( JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer )
{
Console.WriteLine( reader.Value.GetType( ).ToString( ) );
// System.DateTime

string value = reader.Value.ToString( );
DateTime convertedValue = DateTime.Parse( value ).ToLocalTime( );
return convertedValue;
}

JSON.Net 为我提供了一个已经转换的 DateTime 对象,让我在没有任何毫秒数据的情况下自行反序列化。我没有找到任何关于它是错误还是功能的线索。

为了反查,我写了一个 BooleanStringConverter

class BoolStringConverter:
JsonConverter<bool>
{
public override void WriteJson( JsonWriter writer, bool value, JsonSerializer serializer )
{
string convertedValue = false == value ? "False" : "True";
writer.WriteValue( convertedValue );
}

public override bool ReadJson( JsonReader reader, Type objectType, bool existingValue, bool hasExistingValue, JsonSerializer serializer )
{
Console.WriteLine( reader.Value.GetType( ).ToString( ) );
// System.String

string value = ( string ) reader.Value;
bool convertedValue = "False" == value ? false : true;
return convertedValue;
}
}

JSON.Net 没有为我提供一个已经转换的 bool 对象。

这是错误还是功能?

最佳答案

这是 Json.Net 的已知行为。由于 JSON 没有用于表示日期的内置语法(就像 bool 值一样),因此它们必须表示为字符串。默认情况下,Json.Net 会尽量友好地为您解析看起来像日期的字符串。

如果您使用自己的日期转换器,或者想自己处理日期解析,您需要确保设置 DateParseHandlingJsonSerializerSettings中设置为None,否则内部读取器会先尝试处理。

JsonSerializerSettings settings = new JsonSerializerSettings
{
Converters = new List<JsonConverter> { new DateTimeStringConverter() },
DateParseHandling = DateParseHandling.None
};

var foo = JsonConvert.DeserializeObject<Foo>(json, settings);

关于c# - json.net: DateTimeStringConverter 在 ReadJson() 中获取一个已经转换为 DateTime 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53508910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com