• 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

     
     
  • 相关阅读:
    Div+CSS+JQuery实现选项卡,即通过点击不同的li跳转到不同的div中显示不同的内容或者执行不同的操作。
    js如何获取点击<li>标签里的内容值
    python requests库爬取网页小实例:ip地址查询
    python requests库爬取网页小实例:爬取网页图片
    python requests库网页爬取小实例:百度/360搜索关键词提交
    python requests库网页爬取小实例:亚马逊商品页面的爬取
    python使用requests库爬取网页的小实例:爬取京东网页
    hibernate 的入门
    html
    事务的入门(mysql)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2529177.html
Copyright © 2020-2023  润新知