Hello World
Spiga

在传统.NET程序中使用Silverlight SDK里的JSON类库

2010-10-12 17:34 by 老赵, 2584 visits

话说在Silverlight SDK中提供了一套JSON类库,叫做System.Json。这个类库功能很简单,就是使用.NET来表示JSON格式的“结构”。换句话说,就是我之前在JsonMe中所提到的JsonObject,JsonArray之类的东西,但完全不包括JSON结构和实际类型之间的转化。虽然这个类库很不好用(谁用谁知道),但至少是一个可以通用于Silverlight和MonoTouch的类库,因此我决定将JsonMe基于它进行构建。为此,我对mono中的开源实现进行了移植,使它仅仅依赖于功能最基本的.NET Framework 3.5 Client Profile,并修改了其中的一些明显的Bug。

Mono的项目源码可以从github里获得,或者您直接下载mono 2.8的源码tar包,不过现在我们只需要其中的System.Json。System.Json,只有五个文件,不过它依赖了mono的System.ServiceModel.Web.dll里定义的JavaScriptReader和JavaScriptObjectDeserializer类,因此我也将这两个内部类一并移植到System.Json项目中。因此,最终项目的组织结构如下:

从上图中可以看出,如今的System.Json项目只依赖了极少的系统类库,事实上它可以在.NET Framework 3.5 Client Profile下运行,这样无论是Silverlight还是普通的客户端都可以使用它的功能,这是依赖System.Web.Extensions.dll的时候所无法做到的。同样,JsonMe也已经进行了相应的改写,现在它已经能够用于Silverlight,MonoTouch,甚至未来的MonoDroid中。不过基于System.Json之后JsonMe反而因此变得复杂了,这是因为System.Json实在不是一个好用的类库。

mono的System.Json还存在一个bug:JsonObject的Add方法不允许value为null,这是个十足的问题,使得类库无法支持null值。我使用.NET Reflector检查了Silverlight中的实现,它并没有这样的约束,这才符合我的预期。将这个约束去除以后,序列化成JSON字符串的逻辑便会引发NullReferenceException,因此我也修改了对应的序列化逻辑。此外,如果您用DateTime创建一个JsonPrimitive类型,序列化时也会出现问题。我还不太清楚Silverlight SDK中是如何处理这个情况的,再我看来在JSON中放置DateTime也是一个很奇怪的行为,还是先转化为字符串吧。杯具的是,MonoTouch SDK中也有这些bug,不幸中的万幸,只要在MonoTouch重新编译我移植的代码就行了。

如果您对此感兴趣,也不妨获取这些代码捣鼓捣鼓。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

11 条回复

  1. Leonweng
    123.14.56.*
    链接

    Leonweng 2010-10-13 09:14:08

    正准备申请个github账号呢

  2. 程劭非
    61.172.247.*
    链接

    程劭非 2010-10-13 20:35:53

    我一直觉得SL现在的做法是饮鸩止渴,抛弃了原来的DO、DP体系,为了方便引入C#而强行引入CLR,而又不肯抛弃原来的独立平台思维而把自己变成一个山寨.net,

    现在又不满足.net的基础类库自己往上加东西,不知道何时才能再集成回.net

    说实话我真怀念SL1.0时代,虽然简陋的令人无法接受,但是从设计到实现都是没有任何瑕疵的,也许现在微软的老大们只在乎get things done,只在乎让程序员能在SL开发中使用C#,至于是不是要写个DP然后wrap一个属性,是不是一个类C#和C++里要写两遍,这些都是次要的了

  3. 老赵
    admin
    链接

    老赵 2010-10-13 21:47:36

    @程劭非

    DO,DP是指什么啊?

  4. 程劭非
    58.33.116.*
    链接

    程劭非 2010-10-14 00:25:25

    DP=Dependency Property DO=Dependency Object

  5. waynebaby
    65.49.26.*
    链接

    waynebaby 2010-10-14 18:42:50

    不懂,并没有抛弃啊

  6. richlxx
    203.86.42.*
    链接

    richlxx 2010-10-15 10:05:43

    Dependency Property和Dependency Object没有抛弃吧,我还用着呢啊。 不过我也没太深入WPF,所以不知道和silverlight这方面有啥不同。

  7. Tianyi Cui
    122.233.158.*
    链接

    Tianyi Cui 2010-10-15 18:10:38

    发现了upstream的bug而且有能力修正的话应该在github上fork/fix/pull-request啊。

  8. 老赵
    admin
    链接

    老赵 2010-10-15 23:18:12

  9. Tianyi Cui
    72.52.94.*
    链接

    Tianyi Cui 2010-10-17 21:38:29

    赞!这就是开源的力量嘛。不过如果你直接带着包括代码和测试的patch去汇报的话岂不是更好?在著名的开源项目的contributors列表中添加一笔自己的名字也是一大快事啊。

  10. daysky
    116.227.135.*
    链接

    daysky 2010-11-03 19:24:57

    git中的代码json对象序列化有bug,

    var json = new JsonObject();
    json["Name"] = "test";
    json["Data"] = new JsonArray();
    Console.WriteLine(json.ToStrig());
    

    结果得到{"Name", "test""Data", []}。需要修改JsonObject的Save方法

  11. 老赵
    admin
    链接

    老赵 2010-11-03 21:11:23

    @daysky

    的确bug有些多,有机会要整改一下。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我