首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将日期json解析为DateTime

将日期json解析为DateTime
EN

Stack Overflow用户
提问于 2020-11-14 05:04:02
回答 2查看 559关注 0票数 0

JSON是:

代码语言:javascript
复制
{"date":13,"day":5,"hours":19,"minutes":6,"month":10,"nanos":0,"seconds":41,"time":1605265601000,"timezoneOffset":-480,"year":120}

当我试图转换为DateTime**,时,我遇到了以下错误:**

解析值时遇到的Newtonsoft.Json.JsonReaderException HResult=0x80131500 Message=Unexpected字符:{。路径‘,第1行,位置1。Newtonsoft.Json.JsonTextReader.ReadAsDateTime()的Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader阅读器处的Source=Newtonsoft.Json StackTrace: Source=Newtonsoft.Json StackTrace),Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader阅读器的JsonContract contract,布尔hasConverter),Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader读取器的objectType类型,布尔值( checkAdditionalContent),Newtonsoft.Json.JsonConvert.DeserializeObject(String值的objectType类型,类型类型,( Newtonsoft.Json.JsonConvert.DeserializeObjectT at Newtonsoft.Json.JsonConvert.DeserializeObjectT at test.Program.Main(String[] args),E:\code\UI\test\Program.cs:line 77 )

我的代码:

代码语言:javascript
复制
var txt = "{\"date\":13,\"day\":5,\"hours\":19,\"minutes\":6,\"month\":10,\"nanos\":0,\"seconds\":41,\"time\":1605265601000,\"timezoneOffset\":-480,\"year\":120}";
var aa = Newtonsoft.Json.JsonConvert.DeserializeObject<DateTime>(txt);
Console.ReadKey();

当我使用Newtonsoft.Json.dll 3.5版本时,错误就消失了。当我使用Newtonsoft.Json.dll 9.0版本时,会出现错误。

我正在使用VS2017进行构建,我的错误在哪里?

EN

回答 2

Stack Overflow用户

发布于 2020-11-14 08:55:54

我怀疑Json.NET现在希望将DateTime值表示为字符串,而不是JSON对象。当然,你得到的表示法是不寻常的。我建议您按照JSON创建自己的类,并编写一个ToDateTime (或更好的ToDateTimeOffset)来转换它。

(我真的很惊讶,早期版本的Json.NET竟然能处理这个问题。)

更好的是,如果您控制了创建此JSON的代码,最好将其更改为更合理的格式,例如ISO-8601字符串。

下面是执行转换的代码示例。偏移处理有点奇怪,因为DateTimeOffset的工作方式和偏移量的表达方式混合在一起:

代码语言:javascript
复制
using System;
using Newtonsoft.Json;

class Test
{
    static void Main()
    {
        var txt = "{\"date\":13,\"day\":5,\"hours\":19,\"minutes\":6,\"month\":10,\"nanos\":0,\"seconds\":41,\"time\":1605265601000,\"timezoneOffset\":-480,\"year\":120}";
        var jdto = JsonConvert.DeserializeObject<JsonDateTimeOffset>(txt);
        var dto = jdto.ToDateTimeOffset();
        Console.WriteLine(dto);
        Console.WriteLine(dto.ToUniversalTime());
    }
}

public class JsonDateTimeOffset
{
    // All ignored as the Time property handles all these.
    public int Date { get; set; }
    public int Day { get; set; }
    public int Hours { get; set; }
    public int Minutes { get; set; }
    public int Seconds { get; set; }
    // Ignored, as we don't know what it means.
    public int Nanos { get; set; }
    
    // Milliseconds since the unix epoch
    public long Time { get; set; }
    
    // UTC offset in minutes, but reversed from the normal
    // view.
    [JsonProperty("timezoneOffset")]
    public int TimeZoneOffset { get; set; }
    
    public DateTimeOffset ToDateTimeOffset()
    {
        var instant = DateTimeOffset.FromUnixTimeMilliseconds(Time);
        var offset = -TimeSpan.FromMinutes(TimeZoneOffset);
        return new DateTimeOffset(instant.DateTime + offset, offset);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-11-14 08:43:49

您的反序列化对象实际上是

代码语言:javascript
复制
public class Rootobject
{
    public int date { get; set; }
    public int day { get; set; }
    public int hours { get; set; }
    public int minutes { get; set; }
    public int month { get; set; }
    public int nanos { get; set; }
    public int seconds { get; set; }
    public long time { get; set; }
    public int timezoneOffset { get; set; }
    public int year { get; set; }
}

而且不能将该类直接反序列化为DateTime。

现在我想到了两个选择。使用自定义转换器或从RootObject类的属性创建一个新的RootObject实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64831099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档