JSON是:
{"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 )
我的代码:
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进行构建,我的错误在哪里?
发布于 2020-11-14 08:55:54
我怀疑Json.NET现在希望将DateTime值表示为字符串,而不是JSON对象。当然,你得到的表示法是不寻常的。我建议您按照JSON创建自己的类,并编写一个ToDateTime (或更好的ToDateTimeOffset)来转换它。
(我真的很惊讶,早期版本的Json.NET竟然能处理这个问题。)
更好的是,如果您控制了创建此JSON的代码,最好将其更改为更合理的格式,例如ISO-8601字符串。
下面是执行转换的代码示例。偏移处理有点奇怪,因为DateTimeOffset的工作方式和偏移量的表达方式混合在一起:
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);
}
}发布于 2020-11-14 08:43:49
您的反序列化对象实际上是
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实例。
https://stackoverflow.com/questions/64831099
复制相似问题