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数组的序列化和反序列化的详细内容...