none
请问怎样才能正确进行JSON转化与逆转化 RRS feed

  • 问题

  • 我想实现的流程是:
    客户端将数据JSON格式化,发送到服务端,服务端进行反序列化(用于将数据反序列化为Model,插入数据库),将数据从数据库中读出,进行序列化传输,在客户端进行反序列化,用于显示。
    这样就需要既有客户端的JSON工具,还需要有.NET环境下的JSON格式数据转化工具。
    但是我以下的例子总是出现问题,JSON2.JS可以转化与逆转化自己产生的数据,但是对于由服务端传送过来的数据(由服务端JSON工具转化而来)进行逆转化总是出现问题,请问怎样才能正确进行转化与逆转化?

    以下是客户端文件:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title></title>
        <script language="javascript" type="text/javascript" src="json2.js"></script>
        <script language="javascript" type="text/javascript">
            var xmlHttp;

            function createXMLHttpRequest() {
                if (window.ActiveXObject) {
                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                else if (window.XMLHttpRequest) {
                    xmlHttp = new XMLHttpRequest();
                }
            }

            function ShowList() {
                var car = new Car("奥迪", "A6", 2009, "黄色", new Date())
                var carJson = JSON.stringify(car);
                alert(carJson);
                var deCarJson = JSON.parse(carJson);
                alert(deCarJson.Make + deCarJson.Model + deCarJson.Year + deCarJson.Color + deCarJson.Date);// 可以准确转换
               
                createXMLHttpRequest();
                xmlHttp.onreadystatechange = handleStateChange;
                xmlHttp.open("GET", "Handler1.ashx?ts=" + new Date().getTime() + "&jsonStr=" + carJson, true);
                xmlHttp.send(null);
            }

            function handleStateChange() {
                if (xmlHttp.readyState == 4) {
                    if (xmlHttp.status == 200) {
                        parseResults();
                    }
                }
            }

            function parseResults() {
                var jsonStr = xmlHttp.responseText;
                // jsonStr:"{"Make":"59658fea","Model":"A6","Year":2009,"Color":"9ec48272","Date":new Date(1248982452000)}"
                var cars = JSON.parse(jsonStr);
                var color = "";
                for (var i = 0; i < cars.length; i++) {
                    color += " " +  cars[i].color;
                }
                alert(color);
            }

            function Car(make,model,year,color,date) {
                this.Make = make;
                this.Model = model;
                this.Year = year;
                this.Color = color;
                this.Date = date;
            }
        </script>
    </head>
    <body>
    <xml id="xmlid"></xml>
    <input type="button" value="do" onclick="ShowList();" />
    </body>
    </html>

    以下是.net环境下:
    using System;
    using System.Web;
    using Newtonsoft.Json;
    using JsonExSerializer;

    namespace JSONAndList
    {
        /// <summary>
        /// $codebehindclassname$ 的摘要说明
        /// </summary>
        public class Handler1 : IHttpHandler
        {
            public void ProcessRequest(HttpContext context)
            {
                context.Response.ContentType = "text/plain";
                string carJson = context.Request.Params["jsonStr"];
                // 可以通过,但在客户端的JSON.parse()处报:语法错误
                Car car = (Car)JavaScriptConvert.DeserializeObject(carJson, typeof(Car));
                string responseStr = JavaScriptConvert.SerializeObject(car);

                // 不能通过,报错:该字符串未被识别为有效的 DateTime。
                //Serializer s = new Serializer(typeof(Car));
                //Car car = (Car)s.Deserialize(carJson);
                //string responseStr = s.Serialize(car);

                context.Response.Write(responseStr);
            }

            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }

        public class Car
        {
            public Car()
            {
            }

            public Car(string make, string model, int year, string color,DateTime date)
            {
                this.Make = make;
                this.Model = model;
                this.Year = year;
                this.Color = color;
                this.Date = date;
            }

            public string Make
            {
                get;
                set;
            }

            public string Model
            {
                get;
                set;
            }

            public int Year
            {
                get;
                set;
            }

            public string Color
            {
                get;
                set;
            }

            public DateTime Date
            {
                get;
                set;
            }
        }
    }


    做最好的自己
    2009年7月30日 11:47

全部回复

  • 你好 你可以用Newtonsoft.Json.dll
    请参考 http://www.cnblogs.com/pcode/archive/2009/03/19/1417214.html
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年7月31日 4:27
    版主
  • 你好,我使用的就是Newtonsoft.Json.dll,那个JsonExSerializer部分我给注释掉了。

    做最好的自己
    2009年7月31日 5:31
  • 我还有一个问题:
    先不谈我的这个例子的错误,那大家在Ajax开发中是怎么实现这个过程的?
    做最好的自己
    2009年7月31日 5:31
  • 我一般服务器端返回的xml是用xmldocument生成的 或者序列化生成的
    客户端可以通过ActiveX来对xml进行操作
    比如
    var xmlDom=new ActiveXObject('Microsoft.XMLDOM');
    xmlDom.loadXML(document.getElementById('inputPostUrl').value);
    var root=xmlDom.documentElement;
    var bindStatus=xmlDom.createElement('BindStatus');
    var listBoxBindStatus=document.getElementById('ListBoxBindStatus');
    bindStatus.text=listBoxBindStatus.options(listBoxBindStatus.selectedIndex).value;

    然后通过XmlHttp发送到服务器端 服务器端对xml进行解析 返回相应结果


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年7月31日 5:36
    版主
  • 哦。你是直接传输XML数据的啊。
    我是看都在讲JSON,所以我也试试JSON。没想到还不是我想的那么顺利,竟出错。
    做最好的自己
    2009年7月31日 7:58
  • 呵呵,不好意思。自己顶一下,要不就被淹没了。
    做最好的自己
    2009年8月2日 0:03
  • 再顶一下。
    做最好的自己
    2009年8月3日 0:19
  • 怎样才能正确进行JSON转化与反序列化的问题,最近也弄得我焦头烂额。
    就是日期类型Date的问题,我自己现在还没找到一个好的解决方案。求各位高手。

    我现在用的是Json2.js在客户端序列化。然后用jQuery的ajax到服务端、添加一条数据成功后,用Newtonsoft.Json.dll反序列化实体对象返回到客户端组装成Table。

    一. 之前在客户端(js对象中包含'2010-01-12')这样日期类型的数据,我用JSON.stringify()序列化js对象之后,在服务端用JsonConvert.DeserializeObject反序列到实体对象时遇到Datetime对象转化失败。因为实体对象的对应字段是Datetime类型的。
      
       e.g  关于这个问题我在网上参考了一些办法:(1)http://xiarilian12.javaeye.com/blog/532339
                                                                    (2) http://www.cnblogs.com/KangC/archive/2008/12/09/1349468.html
         1、我怎么弄都没弄成功,后面我单独把Date的两个字段单独出来序列化然后传参数到服务端反序列化。(意思是没将对象序列化到一个整体的json对象传到服务端处理的,而是分成多个参数分别反序列化再组成实体对象作插入操作,目的还是为了避免那个Datetime 类型的)

         2、日期我弄成"\/Date(1262275200000+0800)\/" (UTC格式的) ,参考http://wyf.javaeye.com/blog/398630转化成正确的Datetime类型。

    二、依照上面的第一,我是勉强可以将一条json数据插入数据库了。
          现在的问题依然是那个日期的,我纠结呐、插入一条数据成功之后,根据这条数据ID取出这条数据的实体对象。用Newtonsoft.Json反序列化到客户端、用firebug调试。ajax请求已经可以将json数据传到客户端、可是我用JSON.parse()或者用eval('('+数据+')')转化成js对象报错。估计还是时间类型那个地方的错误。这个时候我json数据里面的日期类型AddDate":"\/Date(1263474214453+0800)\/" 这样的、


    不知道我描述得清楚吗,我的主要问题就是用Json2.js + jQuery1.3.2 + Newtonsoft.Json.dll 这几个东东处理json日期类型的问题。
    .NET3.0、3.5 里面自带的的序列化和反序列化的类我没用,一直用的Newtonsoft.Json.dll,它和Json2.js 在一个官网里面,我认为应该比较统一吧。

    不知道是我的方式不对还是什么问题?我不想继续纠结在这里。真的是个杯具啦!
    如果你或者哪位高手弄清楚了、希望你能教教我、我的MSN:silver_light@live.cn

    2010年1月14日 15:40
  • 等待这个问题更好的解决办法
    Do My Best
    2010年2月19日 9:48
  • 我现在用的json2.js和.net的JSON类还可以。不过,就是时间这里有问题。
    Do My Best
    2010年2月19日 9:50