当前位置:Gxlcms > JavaScript > JSON序列化与反序列化实现方法(附代码)

JSON序列化与反序列化实现方法(附代码)

时间:2021-07-01 10:21:17 帮助过:17人阅读

这次给大家带来JSON序列化与反序列化实现方法(附代码),JSON序列化与反序列化实现的注意事项有哪些,下面就是实战案例,一起来看一下。

一、JSON简介

JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式。

JSON是“名值对”的集合。结构由大括号'{}',中括号'[]',逗号',',冒号':',双引号'“”'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。

JSON具有以下的形式:

对象(Object)是一个无序的“名值对”集合,一个对象以”{”开始,”}”结束。每个“名”后跟着一个”:”,多个“名值对”由逗号分隔。如:

  1. var user={"name":"张三","gender":"男","birthday":"1980-8-8"}

数组(Array)是值的有序集合,一个数组以“[”开始,以“]”结束,值之间使用“,”分隔。如:

代码如下:


var userlist=[{"user":{"name":"张三","gender":"男","birthday":"1980-8-8"}},{"user":{"name":"李四","gender":"男","birthday":"1985-5-8"}}];

字符串(String)是由双引号包围的任意数量的Unicode字符的集合,使用反斜线转义。

二、对JSON数据进行序列化和反序列化

可以使用DataContractJsonSerializer类将类型实例序列化为JSON字符串,并将JSON字符串反序列化为类型实例。DataContractJsonSerializer在SystemRuntimeSerializationJson命名空间下,NET Framework 5包含在SystemServiceModelWebdll中,需要添加对其的引用;NET Framework 4在SystemRuntimeSerialization中。

利用DataContractJsonSerializer序列化和反序列化的代码:

  1. using System;
  2. using SystemCollectionsGeneric;
  3. using SystemLinq;
  4. using SystemWeb;
  5. using SystemRuntimeSerializationJson;
  6. using SystemIO;
  7. using SystemText;
  8. /// <summary>
  9. /// JSON序列化和反序列化辅助类
  10. /// </summary>
  11. public class JsonHelper
  12. {
  13. /// <summary>
  14. /// JSON序列化
  15. /// </summary>
  16. public static string JsonSerializer<T>(T t)
  17. {
  18. DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
  19. MemoryStream ms = new MemoryStream();
  20. serWriteObject(ms, t);
  21. string jsonString = EncodingUTFGetString(msToArray());
  22. msClose();
  23. return jsonString;
  24. }
  25. /// <summary>
  26. /// JSON反序列化
  27. /// </summary>
  28. public static T JsonDeserialize<T>(string jsonString)
  29. {
  30. DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
  31. MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(jsonString));
  32. T obj = (T)serReadObject(ms);
  33. return obj;
  34. }
  35. }

序列化Demo:

简单对象Person:

  1. public class Person
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. }

序列化为JSON字符串:

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. Person p = new Person();
  4. pName = "张三";
  5. pAge = 28;
  6. string jsonString = JsonHelperJsonSerializer<Person>(p);
  7. ResponseWrite(jsonString);
  8. }

输出结果:

  1. {"Age":28,"Name":"张三"}

反序列化Demo:

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. string jsonString = "{\"Age\":28,\"Name\":\"张三\"}";
  4. Person p = JsonHelper.JsonDeserialize<Person>(jsonString);
  5. }

运行结果:

ASP.NET中的JSON序列化和反序列化还可以使用JavaScriptSerializer,在System.Web.Script.Serializatioin命名空间下,需引用System.Web.Extensions.dll.也可以使用JSON.NET.

三、JSON序列化和反序列化日期时间的处理

JSON格式不直接支持日期和时间。DateTime值值显示为“/Date(700000+0500)/”形式的JSON字符串,其中第一个数字(在提供的示例中为 700000)是 GMT 时区中自 1970 年 1 月 1 日午夜以来按正常时间(非夏令时)经过的毫秒数。该数字可以是负数,以表示之前的时间。示例中包括“+0500”的部分可选,它指示该时间属于Local类型,即它在反序列化时应转换为本地时区。如果没有该部分,则会将时间反序列化为Utc。

修改Person类,添加LastLoginTime:

  1. public class Person
  2. {
  3. public string Name { get; set; }
  4. public int Age { get; set; }
  5. public DateTime LastLoginTime { get; set; }
  6. }
  1. Person p = new Person();
  2. p.Name = "张三";
  3. p.Age = 28;
  4. p.LastLoginTime = DateTime.Now;
  5. string jsonString = JsonHelper.JsonSerializer<Person>(p);

序列化结果:

  1. {"Age":28,"LastLoginTime":"\/Date(1294499956278+0800)\/","Name":"张三"}

1 、在后台使用正则表达式对其替换处理。修改JsonHelper:

  1. using System;
  2. using SystemCollectionsGeneric;
  3. using SystemLinq;
  4. using SystemWeb;
  5. using SystemRuntimeSerializationJson;
  6. using SystemIO;
  7. using SystemText;
  8. using SystemTextRegularExpressions;
  9. /// <summary>
  10. /// JSON序列化和反序列化辅助类
  11. /// </summary>
  12. public class JsonHelper
  13. {
  14. /// <summary>
  15. /// JSON序列化
  16. /// </summary>
  17. public static string JsonSerializer<T>(T t)
  18. {
  19. DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
  20. MemoryStream ms = new MemoryStream();
  21. serWriteObject(ms, t);
  22. string jsonString = EncodingUTFGetString(msToArray());
  23. msClose();
  24. //替换Json的Date字符串
  25. string p = @"\\/Date\((\d+)\+\d+\)\\/";
  26. MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
  27. Regex reg = new Regex(p);
  28. jsonString = regReplace(jsonString, matchEvaluator);
  29. return jsonString;
  30. }
  31. /// <summary>
  32. /// JSON反序列化
  33. /// </summary>
  34. public static T JsonDeserialize<T>(string jsonString)
  35. {
  36. //将"yyyy-MM-dd HHmmss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
  37. string p = @"\d{4}-\d{2}-\d{2}\s\d{2}\d{2}\d{2}";
  38. MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
  39. Regex reg = new Regex(p);
  40. jsonString = regReplace(jsonString, matchEvaluator);
  41. DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
  42. MemoryStream ms = new MemoryStream(EncodingUTFGetBytes(jsonString));
  43. T obj = (T)serReadObject(ms);
  44. return obj;
  45. }
  46. /// <summary>
  47. /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
  48. /// </summary>
  49. private static string ConvertJsonDateToDateString(Match m)
  50. {
  51. string result = stringEmpty;
  52. DateTime dt = new DateTime(1970,1,1);
  53. dt = dtAddMilliseconds(longParse(mGroups[1]Value));
  54. dt = dtToLocalTime();
  55. result = dtToString("yyyy-MM-dd HHmmss");
  56. return result;
  57. }
  58. /// <summary>
  59. /// 将时间字符串转为Json时间
  60. /// </summary>
  61. private static string ConvertDateStringToJsonDate(Match m)
  62. {
  63. string result = stringEmpty;
  64. DateTime dt = DateTimeParse(mGroups[0]Value);
  65. dt = dtToUniversalTime();
  66. TimeSpan ts = dt - DateTimeParse("1970-01-01");
  67. result = stringFormat("\\/Date({0}+0800)\\/",tsTotalMilliseconds);
  68. return result;
  69. }
  70. }

序列化Demo:

  1. Person p = new Person();
  2. p.Name = "张三";
  3. p.Age = 28;
  4. p.LastLoginTime = DateTime.Now;
  5. string jsonString = JsonHelper.JsonSerializer<Person>(p);

运行结果:

  1. {"Age":28,"LastLoginTime":"2011-01-09 01:00:56","Name":"张三"}

反序列化Demo:

  1. string json = "{\"Age\":28,\"LastLoginTime\":\"2011-01-09 00:30:00\",\"Name\":\"张三\"}";
  2. p=JsonHelper.JsonDeserialize<Person>(json);

运行结果:

在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。

2、利用JavaScript处理

  1. function ChangeDateFormat(jsondate) {
  2. jsondate = jsondate.replace("/Date(", "").replace(")/", "");
  3. if (jsondate.indexOf("+") > 0) {
  4. jsondate = jsondate.substring(0, jsondate.indexOf("+"));
  5. }
  6. else if (jsondate.indexOf("-") > 0) {
  7. jsondate = jsondate.substring(0, jsondate.indexOf("-"));
  8. }
  9. var date = new Date(parseInt(jsondate, 10));
  10. var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) date.getMonth() + 1;
  11. var currentDate = date.getDate() < 10 ? "0" + date.getDate() date.getDate();
  12. return date.getFullYear() + "-" + month + "-" + currentDate;
  13. }

简单Demo :

ChangeDateFormat("\/Date(1294499956278+0800)\/");

结果:

2011-1-8

四、JSON序列化和反序列化集合、字典、数组的处理

在JSON数据中,所有的集合、字典和数组都表示为数组。

List<T>序列化:

  1. List<Person> list = new List<Person>()
  2. {
  3. new Person(){ Name="张三", Age=28},
  4. new Person(){ Name="李四", Age=25}
  5. };
  6. string jsonString = JsonHelper.JsonSerializer<List<Person>>(list);

序列化结果:

  1. "[{\"Age\":28,\"Name\":\"张三\"},{\"Age\":25,\"Name\":\"李四\"}]"

字典不能直接用于JSON,Dictionary字典转化为JSON并不是跟原来的字典格式一致,而是形式以Dictionary的Key作为名称”Key“的值,以Dictionary的Value作为名称为”Value“的值 。如:

  1. Dictionary<string, string> dic = new Dictionary<string, string>();
  2. dic.Add("Name", "张三");
  3. dic.Add("Age", "28");
  4. string jsonString = JsonHelper.JsonSerializer < Dictionary<string, string>>(dic);

序列化结果:

  1. "[{\"Key\":\"Name\",\"Value\":\"张三\"},{\"Key\":\"Age\",\"Value\":\"28\"}]"

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

jsonp+json实现AJAX跨域请求

JS基于ajax操作信息的使用

以上就是JSON序列化与反序列化实现方法(附代码)的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行