zoukankan      html  css  js  c++  java
  • JSON学习笔记

    JSON:JavaScript 对象表示法(JavaScript Object Notation)。

    JSON 是存储和交换文本信息的语法。类似 XML。

    JSON 比 XML 更小、更快,更易解析。

    实例:

    View Code
     1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="json_test.aspx.cs" Inherits="Web_SoftAceTest.json.json_test" %>
    2
    3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4
    5 <html xmlns="http://www.w3.org/1999/xhtml" >
    6 <head runat="server">
    7 <title>Untitled Page</title>
    8 <script type="text/javascript">
    9 var text = '{employees:[' +
    10 '{"LastName":"Getes","FirstName":"Bill"},' +
    11 '{"LastName":"Yue","FirstName":"Ace"},' +
    12 '{"LastName":"Bush","FirstName":"George"}]}';
    13 var obj = eval("(" + text + ")");
    14 </script>
    15 </head>
    16 <body>
    17 <form id="form1" runat="server">
    18 <div>
    19 <p>
    20 Name:<span id="sp_name"></span><br />
    21 Age:<span id="sp_age"></span><br />
    22 Address:<span id="sp_address"></span><br />
    23 Phone:<span id="sp_phone"></span>
    24 </p>
    25
    26 <script type="text/javascript">
    27 var JsonObject = { employees: [
    28 { "Name": "AceYue",
    29 "Age": "22",
    30 "Address": "Guangdong Shenzheng",
    31 "Phone": "1234567"
    32 },
    33 {
    34 "Name": "Getes",
    35 "Age": "52",
    36 "Address": "Americ",
    37 "Phone": "555-1234567"
    38 }
    39 ]
    40 };
    41
    42 document.getElementById("sp_name").innerHTML = JsonObject.employees[1].Name;
    43 document.getElementById("sp_age").innerHTML = JsonObject.employees[1].Age;
    44 document.getElementById("sp_address").innerHTML = JsonObject.employees[1].Address;
    45 document.getElementById("sp_phone").innerHTML = JsonObject.employees[1].Phone;
    46 </script>
    47
    48 <p>
    49 FirstName:<span id="sp_firstname"></span><br />
    50 LastName:<span id="sp_lastname"></span>
    51 </p>
    52 <script type="text/javascript">
    53 document.getElementById("sp_firstname").innerHTML = obj.employees[0].FirstName;
    54 document.getElementById("sp_lastname").innerHTML = obj.employees[0].LastName;
    55 </script>
    56 </div>
    57 </form>
    58 </body>
    59 </html>

    类似 XML

    • JSON 是纯文本
    • JSON 具有“自我描述性”(人类可读)
    • JSON 具有层级结构(值中存在值)
    • JSON 可通过 JavaScript 进行解析
    • JSON 数据可使用 AJAX 进行传输

    相比 XML 的不同之处

    • 没有结束标签
    • 更短
    • 读写的速度更快
    • 能够使用内建的 JavaScript eval() 方法进行解析
    • 使用数组
    • 不使用保留字

    JSON 值可以是:

    • 数字(整数或浮点数)
    • 字符串(在双引号中)
    • 逻辑值(true 或 false)
    • 数组(在方括号中)
    • 对象(在花括号中)
    • null

    json序列化与反序列化

    json的序列化需要用到DataContractJsonSerializer类,在命名空间System.Runtime.Serialization.Json;下。.NET Framework 3.5需要添加System.ServiceModel.Web引用;.NET Framework 4在System.Runtime.Serialization中。

    jsonhelper类:

    View Code
     1 public class JsonHelper
    2 {
    3 /// <summary>
    4 /// json序列号
    5 /// </summary>
    6 /// <typeparam name="T"></typeparam>
    7 /// <param name="t"></param>
    8 /// <returns></returns>
    9 public static string JsonSerializa<T>(T t)
    10 {
    11 DataContractJsonSerializer zer = new DataContractJsonSerializer(typeof(T));
    12 MemoryStream ms = new MemoryStream();
    13 zer.WriteObject(ms, t);
    14 string jsonstring = Encoding.UTF8.GetString(ms.ToArray());
    15 ms.Close();
    16 return jsonstring;
    17 }
    18
    19 /// <summary>
    20 /// json反序列化
    21 /// </summary>
    22 /// <typeparam name="T"></typeparam>
    23 /// <param name="strjson"></param>
    24 /// <returns></returns>
    25 public static T JsonDeserializa<T>(string strjson)
    26 {
    27 DataContractJsonSerializer zer = new DataContractJsonSerializer(typeof(T));
    28 MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strjson));
    29 T obj = (T)zer.ReadObject(ms);
    30 return obj;
    31 }
    32 }

    person类:

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

    简单实现:

    View Code
    1 protected void Page_Load(object sender, EventArgs e)
    2 {
    3 Person p = new Person();
    4 p.Name = "Ace";
    5 p.Age = 22;
    6
    7 string json = JsonHelper.JsonSerializa<Person>(p);
    8 Response.Write(json);
    9 }

    json序列化处理日期类型的处理

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

    修改jsonhelper类需用到的名称空间

    View Code
    1 using System.Runtime.Serialization.Json;
    2 using System.IO;
    3 using System.Text;
    4 using System.Text.RegularExpressions;
    5 using System.Collections.Generic;//List名称空间

    jsonhelper类的修改

    View Code
    public class JsonHelper
    {

    /// <summary>
    /// json序列化
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <returns></returns>
    public static string JsonSerializer<T>(T t)
    {
    DataContractJsonSerializer zer = new DataContractJsonSerializer(typeof(T));
    MemoryStream ms = new MemoryStream();
    zer.WriteObject(ms, t);
    string jsonstring = Encoding.UTF8.GetString(ms.ToArray());
    ms.Close();

    string p = @"\\/Date\((\d+)\+\d+\)\\/";
    MatchEvaluator me = new MatchEvaluator(ConvertJsonDateToDateString);
    Regex rg = new Regex(p);
    jsonstring = rg.Replace(jsonstring, me);
    return jsonstring;
    }

    /// <summary>
    /// json反序列化
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="jsonstring"></param>
    /// <returns></returns>
    public static T JsonDeserializer<T>(string jsonstring)
    {
    string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
    MatchEvaluator me = new MatchEvaluator(ConvertDateTimeToJsonDate);
    Regex rg = new Regex(p);
    jsonstring = rg.Replace(jsonstring, me);
    DataContractJsonSerializer zer = new DataContractJsonSerializer(typeof(T));
    MemoryStream ms=new MemoryStream(Encoding.UTF8.GetBytes(jsonstring));
    T obj = (T)zer.ReadObject(ms);
    return obj;
    }

    /// <summary>
    /// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
    /// </summary>
    /// <param name="m"></param>
    /// <returns></returns>
    private static string ConvertJsonDateToDateString(Match m)
    {
    string result = string.Empty;
    DateTime dt = new DateTime(1970,1,1);
    dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
    dt = dt.ToLocalTime();
    result = dt.ToString("yyyy-MM-dd HH:mm:ss");
    return result;
    }

    /// <summary>
    /// 将时间字符串转化成json时间
    /// </summary>
    /// <param name="m"></param>
    /// <returns></returns>
    private static string ConvertDateTimeToJsonDate(Match m)
    {
    string result = string.Empty;
    DateTime dt = DateTime.Parse(m.Groups[0].Value);
    dt = dt.ToUniversalTime();
    TimeSpan ts = dt - DateTime.Parse("1970-01-01");
    result = string.Format("\\/Date({0}+0800)\\/",ts.TotalMilliseconds);
    return result;
    }
    }

    person类的修改

    View Code
    public class Person
    {
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime LastLoginTime { get; set; }
    }

    实例调用及对集合、字典、数组的处理

    View Code
    protected void Page_Load(object sender, EventArgs e)
    {
    Person ps = new Person();
    ps.Age = 22;
    ps.Name = "Ace";
    ps.LastLoginTime = DateTime.Now;

    string json = JsonHelper.JsonSerializer<Person>(ps);
    Response.Write(json);

    List<Person> lt = new List<Person>()
    {
    new Person(){Name="Ace",Age=22,LastLoginTime=DateTime.Now},
    new Person(){Name="Getes",Age=55,LastLoginTime=DateTime.Now}
    };
    string jsonstring = JsonHelper.JsonSerializer<List<Person>>(lt);
    Response.Write(jsonstring);

    Dictionary<string, string> dy = new Dictionary<string, string>();
    dy.Add("Name", "Ace");
    dy.Add("Age","22");

    string json1 = JsonHelper.JsonSerializer<Dictionary<string, string>>(dy);
    Response.Write(json1);
    }

    用javascript处理

    View Code
    //        在后台替换字符串适用范围比较窄,如果考虑到全球化的有多种语言还会更麻烦。
    //2. 利用JavaScript处理
    function ChangeDateFormat(jsondate) {
    jsondate = jsondate.replace("/Date(", "").replace(")/", "");
    if (jsondate.indexOf("+") > 0) {
    jsondate = jsondate.substring(0, jsondate.indexOf("+"));
    }
    else if (jsondate.indexOf("-") > 0) {
    jsondate = jsondate.substring(0, jsondate.indexOf("-"));
    }

    var date = new Date(parseInt(jsondate, 10));
    var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1;
    var currentDate
    = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
    return date.getFullYear() + "-" + month + "-" + currentDate;
    }
    //简单Demo :
    //ChangeDateFormat("\/Date(1294499956278+0800)\/");


     




     



  • 相关阅读:
    [工具推荐]005.Axure RP Pro 7.0模拟C#TAB控件
    [安卓基础] 008.Android中的显示单位
    [JavaWeb基础] 008.Spring初步配置
    [批处理教程之Shell]002.Linux 常用命令大全
    [注]新手学习编程的最佳方式是什么?
    [C#打包部署教程]001.VS2012 + InstallShield
    [站点推荐]001.学习新技能的37个最佳网站(The 37 Best Websites To Learn Something New)
    程序员如何像写代码一样找女朋友
    [工具-006] C#如何模拟发包登录
    [Linux系统] (1)常用操作(CentOS 7.x)
  • 原文地址:https://www.cnblogs.com/zcttxs/p/2409593.html
Copyright © 2011-2022 走看看