采访:James Newton-King谈Json.NET 4.5

Json.NET项目刚刚发布了.NET JSON框架4.5版本。新版本包含了许多新特性,并带来了显著的速度提升。InfoQ最近采访了Json.NET的创建者James Newton-King,采访过程谈及了新版本以及整个项目。

InfoQ: 在最后两个主要发布的版本(Json.NET 4.0和4.5)中,你最满意的特性有哪些?

James Newton-King:对于Json.NET 4.0,我比较的满意的是借助.NET 4.0而加入的动态支持。我最喜欢添加那些能够让我能边做边学的特性。例如,在JObject/JArray/JValue上实现IDynamicMetaObjectProvider对我来说无疑是一个学习的过程,而我也希望当前版本能够从中受益。在实现的同时,我还需要将其分离以便将它从Json.NET支持的旧版本中排除。

将ISO 8601日期格式作为默认的序列化格式是Json.NET 4.5中我最喜爱的特性。JSON中的日期对于我来说一直是个头疼的问题,虽然Json.NET一开始就使用了微软的日期格式,但我从来都不喜欢。JSON库的互操作性对于非微软平台显然是个问题,不过更主要的原因是,使用微软格式的日期易读性很差。开发人员调试代码时,ISO格式“2009-02-15T00:00:00Z”要比微软的旧日期格式“\/Date(1198908717056)\/”易读得多。令人惊讶的是,对于该破坏性改动,我还没有收到任何人的抱怨,我想它的推出肯定让.NET开发人员很开心。

InfoQ:在未来版本中,你最想要看到哪些关键特性被添加?(你在Codeplex上的特性列表提到了添加JSON递归上限支持,还有其他的吗?)

J.N.K.:添加JSON递归上限支持主要出于两个原因。第一个原因是因为微软的JSON序列化器支持它,而我想要支持微软提供的所有特性。我觉得添加一个上限很有用,特别是如果你想公开暴露端点并希望进行锁定的话。另外一个原因是ASP.NET MVC团队会把JSON与Web API一同使用。目前他们自己实现了该功能,不过由于添加这个特性很容易,所以我想让Web API与Json.NET的工作方式变得与JSON的工作方式尽可能地相似。

我从来不为Json.NET添加新特性而筹备什么计划。我倾向于看看Json.NET开发人员在一些网站如StackOverflow上的提问,看看他们报告给我的bug,然后想出一些主意来帮助改善这种情况。有的时候新特性与文档之间存在一个空档期,以至于开发人员不知道新特性已经有了。

InfoQ:你曾经提到“一个完美的bug修复意味着当前性能测试能够跑得70,000%快”,能否给大家解释一下?

J.N.K.:一位微软开发人员在对Json.NET进行压力测试后发现,将100,000个嵌套数组反序列化为LINQ to JSON对象花费的时间比想象中的要长得多。性能差的原因是因为LINQ to JSON对象会检查递归循环,也就是说,如果一个数组不是它自己的父容器,那么每次当新的嵌套数组反序列化时,都会检查它所有的父容器,例如,数组90,001会检查它的90,000个父容器,数组90,002会检查它的90,001个父容器等等。显然这种情况不是很理想。

解决方案很简单:检查被添加的条目是否拥有任何子元素。如果一个数组没有任何子元素的话,那么因为它不可能作为它自身父容器,因此可以跳过递归父容器检查。这一行的代码改动立刻带来了由43秒到63毫秒的速度提升。

InfoQ:4.0-6发布版本着重强调了比.NET framework方案更好的性能。你认为Json.NET的性能比起它的整个性能集合有重要性如何?

J.N.K.:除了那些需要极限性能的人员之外,几乎每一位开发人员都会从提高生产效率的特性中获益,因此平衡两者变得很重要。我要做的是确保Json.NET比.NET framework序列化器更快,并同时提供更多功能。

InfoQ:好的,再次感谢James Newton-King的到来。如果你想要关于所有新特性的完整信息,可以查看这篇宣布;而如果想了解所有项目特性的概述,可以访问它的Codeplex站点。

查看英文原文:Interview: James Newton-King on Json.NET 4.5

你可能感兴趣的:(采访:James Newton-King谈Json.NET 4.5)