C#解析json时,总出现反序列化失败是啥原因解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#解析json时,总出现反序列化失败是啥原因解决方案相关的知识,希望对你有一定的参考价值。

估计是格式无法转换的错误。
看下json数据格式对不对。
最简单的办法是你写一个对象把他序列化成json,看看和传过来的json有什么区别。
比如说bool值,传过来的到底是true还是字符串的"true"或者是1
参考技术A 快递:显示签收即联 参考技术B 有更具体的信息吗?是循环引用吗?

使用 JSON.NET 反序列化 DateTime 时如何保留时区? [复制]

【中文标题】使用 JSON.NET 反序列化 DateTime 时如何保留时区? [复制]【英文标题】:How to preserve timezone when deserializing DateTime using JSON.NET? [duplicate] 【发布时间】:2015-01-18 12:40:30 【问题描述】:

我正在使用 JSON.NET 在 C# 中解析一些 JSON。 JSON 中的字段之一是日期/时间,如下所示:


    "theTime":"2014-11-20T07:15:11-0500",
    // ... a lot more fields ...

请注意,时间部分是 07:15:11(格林威治标准时间 5 小时的 TZ)

我从这样的流中解析 JSON:

 using (var streamReader = new StreamReader(rcvdStream))
 
     JsonTextReader reader = new JsonTextReader(streamReader);
     JsonSerializer serializer = new JsonSerializer();
     JObject data = serializer.Deserialize<JObject>(reader);
     //...
  

然后访问时间:

DateTime theTime = (DateTime)data["theTime"];

但是,这给了我这个 DateTime 对象:

20/11/2014 12:15:11
Date: 20/11/2014 00:00:00
Day: 20
DayOfWeek: Thursday
DayOfYear: 324
Hour: 12
Kind: Local
Millisecond: 0
Minute: 15
Month: 11
Second: 11
Ticks: 635520825110000000
TimeOfDay: 12:15:11
Year: 2014

我需要知道原始的本地时间和 tz 偏移量,但我似乎在反序列化过程中丢失了该信息,它给了我我认为是本地时间的时间(我在英国,所以目前在 GMT+0)。

有没有办法在反序列化时保留时区信息?

编辑:添加了有关我如何反序列化的更多详细信息。

【问题讨论】:

你是如何创建你的serializer 对象的? 您是否尝试过将其反序列化/强制转换为 DateTimeOffset 而不是 DateTime? 我建议转换为 UTC,以 UTC 发送/接收,并在客户端转换为本地时间以进行显示。 请注意,该帖子建议作为该帖子的副本,虽然它最初询问时区代码,但它有您正在寻找的答案:您的字符串具有时区偏移量,它显示了如何正确解析包含时区偏移量的DateTime 我不同意这是一个重复的问题。链接到的另一个答案是关于解析 DateTime 但不是来自 Json 反序列化器。为此,他必须将反序列化器更改为仅将日期作为字符串返回,然后在需要的地方解析字符串。 serializer.DateParseHandling = DateParseHandling.None; 【参考方案1】:

我会改用DateTimeOffsetDateTime 没有任何相关的有用时区信息。

您可以通过更改 serializer.DateParseHandling 来反序列化为 DateTimeOffset

JsonSerializer serializer = new JsonSerializer();
serializer.DateParseHandling = DateParseHandling.DateTimeOffset;

JObject data = serializer.Deserialize<JObject>(reader);

var offset = (DateTimeOffset)data["theTime"];

Console.WriteLine(offset.Offset);    // -5:00:00
Console.WriteLine(offset.DateTime);  // 11/20/2014 7:15:11 AM

示例: https://dotnetfiddle.net/I9UAuC

【讨论】:

成功了!非常感谢。 @DaveW:没问题,很乐意提供帮助。

以上是关于C#解析json时,总出现反序列化失败是啥原因解决方案的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中反序列化复杂对象

C#序列化和反序列化到底是啥意思?

如何在C#中解析/反序列化从rest服务返回的JSON

C# Newtonsoft.Json 解析多嵌套json 进行反序列化

C# Newtonsoft.Json 解析多嵌套json 进行反序列化

Json反序列化器或正则表达式或Json解析以在c#中转换Json字符串