将JSON转换为类会改变字符串值.JSON.NET中的Bug

本文关键字:JSON NET Bug 字符串 中的 转换 改变 | 更新日期: 2023-09-27 18:11:59

我有一个奇怪的问题。我使用的JSON框架从newtonsoft。但是它正在改变我的一些字符串的日期格式。

我在JSON字符串中传输一些字符串,像这样:

{"MyStrings":["Hello","World"]}

我有这个匹配的DTO类:

public class Test
{
    public List<string> MyStrings { get; set; }
}

现在我想将它反序列化到我的DTO类中,像这样:

string content = @"{""MyStrings"":[""2016-10-07T13:37:01.4209934Z"",""2016-10-07T13:37:01.4209934Z""]}";
var obj = JObject.Parse(content);
var test = obj.ToObject<Test>();

你看,在JSON字符串中,有一些字符串碰巧看起来像一个日期时间值。

{
  "MyStrings":
    ["2016-10-07T13:37:01.4209934Z",
    "2016-10-07T13:37:01.4209934Z"]
}

如果我们研究字符串值,我们得到:"10/07/2016 13:37:01"。完全不同的东西

这是怎么回事?我没有改变默认行为。JSON。NET正在自己更改字符串值。为什么这个框架改变我的字符串值?我想让它保持原样——一个字符串。

是JSON中的一个bug吗?或者我可以通过特殊设置控制此行为吗?

我尝试了JsonSerializerSettings中的所有enum设置。

-DateParseHandling.None
-DateFormatString
-DateFormatHandling
-DateTimeZoneHandling

毫无效果。

将JSON转换为类会改变字符串值.JSON.NET中的Bug

我认为这是因为您使用的是标准的JObject。解析,它'认为'这些值是日期(然后在执行。toobject()时对它们调用ToString())。

试试这个:

var foo = JsonConvert.DeserializeObject<Test>(content);

这样做,反序列化器将知道哪个是每个属性的目标类型,我猜。

JsonConvert是Newtonsoft内部的静态类。Json。

我找到了解决问题的方法。感谢qwertoyo的回答。

我不能直接使用DeserializeObject<>。我们使用JSON。NET在一个大型引擎中,首先它将被解析。稍后它将被转换为类型'X'。所以我要拆分这个

这是工作在我的场景:

JsonSerializerSettings settings = new JsonSerializerSettings
            {
                DateParseHandling = DateParseHandling.None
            };
object dto = jObject.ToObject(dtoType, JsonSerializer.Create(settings));

这类似于"JObject"的默认实现。