好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

nodejs ,json数组的序列化和反序列化json数组的序列化和反序列化

nodejs ,json数组的序列化和反序列化json数组的序列化和反序列化

自己写nodejs也有一段时间,踩过很多坑(而且大部分是自己给自己埋),也见过很多别人踩过的坑,原因其实也很简单,要么是对这个知识点理解不够深入,要么就是编码的习惯不好。这段响应 朋春 大牛的号召,打算陆陆续续整理下这些坑,算是给自己一个备忘,同时也希望能对大家有所帮助。

     1. callback

    事件回调是nodejs非常常见的一个应用场景,那大家先来看看以下这段代码是否存在什么问题?

get(params,  function  (err, data) {
    if   (err) {
    callback(err);
  }
    //  对data进行操作 
   var  row = data[0 ];
}); 

     看出来了吧。对,就是err存在时,callback之后,接下来的代码还是要执行的。而这时,data值是什么,我们往往是没办法控制的。如果data这时返回的是undefined,那么就悲剧了,程序肯定报错。当然解决方法很简单,就是在callback之前加个return即可:

get(params,  function  (err, data) {
    if   (err) {
      return   callback(err);
  }
    //  对data进行操作 
   var  row = data[0 ];
}); 

    这个知识点并不是很难,但往往是初学者特别容易犯的错,甚至已经写了很久代码的同学也会偶尔犯这种低级错误。

    再来一个更隐蔽的:

db.get(key,  function  (err, data) {
    if   (err) {
      return   callback(err);
  }
    try   {
    callback(  null  , JSON.parse(data.toString()))
  }   catch  (e) {
    callback(e);
  }
}); 

     看似没有任何问题吧。嘿嘿,揭晓答案,当data为undefined或者不是个json数据时,情况会怎么样?对,被回调两次。callback(null, Error)一次,callback(e),这在一个大项目绝对是坑爹了,排错都需要很久。

        2. buffer

      还是老规矩,先看代码:

 var  data = "" ;  
res.on( 'data',  function   (chunk) {  
  data  +=  chunk;  
})  
.on( "end",  function   () {  
    //  对data转码   
}); 

    这段代码在chunk都是ascii码数据或者数据量比较少时是没有问题,但如果你的数据是大量中文的话,恭喜你,中枪了,会出现乱码。其原因是两个chunk(Buffer对象)的拼接并不正常,相当于进行了buffer.toString() + buffer.toString()。如果buffer不是完整的,则toString出来后的string是存在问题的(比如一个中文字被截断)。具体可以参见 朴灵 写得这篇文章: http://cnodejs.org/topic/4faf65852e8fb5bc65113403

    

    3. 深度嵌套

    很多刚开始写nodejs代码的人,由于思路还停留在同步的思维,所以或多或少写过这样的代码:

func1(err,  function  (err1, data1) {
  func2(err1,   function  (err2, data2) {
    func3(err3,   function  (err3, data3) {
      func4(err4,   function  (err4, data4) {
        .......
      })
    })
  })
}) 

    先别说这样的代码是否易于维护,光样子就够难看,代码都“斜”了。不怕大家耻笑,我自己刚开始就写时也写过这样“坑爹”的代码,为此自己当时还写了篇《 如何让nodejs同步操作 》讲如何解决这个问题。不过从源头上,大家还是要尽量避免采用这种同步的方法,因为nodejs得优势就在于异步,硬生生要做成同步绝对吃力不讨好

 

 

标签:  nodejs

如题,我就不多说了,自己看代码的,很好理解

 using   System;
  using   System.Collections.Generic;
  using   System.Web;
  using   System.Web.UI;
  using   System.Web.UI.WebControls;
  using   System.IO;
  using   System.Text;
  using   System.Web.Script.Serialization;
  using   System.Runtime.Serialization.Json;



  ///   <summary> 
 ///   json反序列化对象
  ///   </summary> 
 public   class   Nature
{
      public   string  name {  get ;  set ; } //  属性编号 
     public   string  sex {  get ;  set ; }   //  分类编号 
 }


  ///   <summary> 
 ///   json反序列化对象
  ///   </summary> 
 public   class   Person
{
      public   string  name {  get ;  set ; } //  属性编号 
     public   string  sex {  get ;  set ; }   //  分类编号 
     public   string  age {  get ;  set ; }   //  分类编号 
     public   string  tel {  get ;  set ; }   //  分类编号 
 }



  public   partial   class   _Default : System.Web.UI.Page
{


      protected   void  Page_Load( object   sender, EventArgs e)
    {
          //  复杂的json解析 
        String json =  "  [{\"name\":\"zhangsan\",\"sex\":\"男\"},{\"name\":\"李四\",\"sex\":\"男\"},{\"name\":\"张娟\",\"sex\":\"女\"},{\"name\":\"慧娟\",\"sex\":\"女\"}]  "  ;
        List <Nature> nt = Deserialize<List<Nature>> (json);
          if  (nt !=  null  && nt.Count >  0  )
        {
            Response.Write(  "  复杂的json反序列化:<br/>  "  );
              foreach  (Nature dt  in  nt) //  打印集合中的元素                 
             {
                Response.Write(dt.name + "  <br/>  "  );
            }
        }


          //  简单的json解析 
        String json1 =  "  {\"name\":\"张三\",\"sex\":\"男\",\"age\":\"25\",\"tel\":\"1301554XXXX\"}  "  ;


        JavaScriptSerializer js  =  new   JavaScriptSerializer();
        Person pe  = js.Deserialize<Person> (json1);

        Response.Write(  "  <br/>简单的json反序列化:  "  +  pe.name);


        Response.Write(  "  <h5>序列化操作</h5>  "  );
        Response.Write(  "  <h5>复杂对象序列化</h5>  "  );
        List <Nature> list =  new  List<Nature> ()   
        {   
              new  Nature(){ name= "  张三  " , sex= "  男  "  },   
              new  Nature(){ name= "  慧娟  " , sex= "  女  "  }   
        };
          string  jsonTxt = JsonSerializer<List<Nature>> (list);
        Response.Write(jsonTxt);

        Response.Write(  "  <h5>简单对象序列化</h5>  "  );
        Person pes  =  new   Person();

        pes.name  =  "  姐姐  "  ;
        pes.sex  =  "  女  "  ;
        pes.tel  =  "  1301554XXXX  "  ;
        pes.age  =  "  23  "  ;

          string  json1Txt = JsonSerializer<Person> (pes);
        Response.Write(json1Txt);
    }



      ///   <summary> 
     ///   反序列化json数组
      ///   </summary> 
     ///   <typeparam name="T">  对象  </typeparam> 
     ///   <param name="json">  json数组  </param> 
     ///   <returns></returns> 
     public   T Deserialize<T>( string   json)
    {
        T obj  = Activator.CreateInstance<T> ();
          using  (MemoryStream ms =  new   MemoryStream(Encoding.UTF8.GetBytes(json)))
        {
            DataContractJsonSerializer serializer  =  new   DataContractJsonSerializer(obj.GetType());
              return   (T)serializer.ReadObject(ms);
        }
    }


      ///   <summary> 
     ///   序列化对象为json
      ///   </summary> 
     ///   <typeparam name="T">  类型  </typeparam> 
     ///   <param name="t">  对象  </param> 
     ///   <returns></returns> 
     public    string  JsonSerializer<T> (T t)
    {
        DataContractJsonSerializer ser  =  new  DataContractJsonSerializer( typeof  (T));
        MemoryStream ms  =  new   MemoryStream();
        ser.WriteObject(ms, t);
          string  jsonString =  Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
          return   jsonString;
    }
} 

运行图片:

源码: https://files.cnblogs.com/netqq/Json.zip

 

 

标签:  json ,  序列化 ,  反序列化

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于nodejs ,json数组的序列化和反序列化json数组的序列化和反序列化的详细内容...

  阅读:74次