• json学习笔记


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

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

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

    实例:

    View Code
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="json_test.aspx.cs" Inherits="Web_SoftAceTest.json.json_test" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title>Untitled Page</title>
    <script type="text/javascript">
    var text = '{employees:[' +
    '{"LastName":"Getes","FirstName":"Bill"},' +
    '{"LastName":"Yue","FirstName":"Ace"},' +
    '{"LastName":"Bush","FirstName":"George"}]}';
    var obj = eval("(" + text + ")");
    </script>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    <p>
    Name:<span id="sp_name"></span><br />
    Age:<span id="sp_age"></span><br />
    Address:<span id="sp_address"></span><br />
    Phone:<span id="sp_phone"></span>
    </p>

    <script type="text/javascript">
    var JsonObject = { employees: [
    {
    "Name": "AceYue",
    "Age": "22",
    "Address": "Guangdong Shenzheng",
    "Phone": "1234567"
    },
    {
    "Name": "Getes",
    "Age": "52",
    "Address": "Americ",
    "Phone": "555-1234567"
    }
    ]
    };

    document.getElementById(
    "sp_name").innerHTML = JsonObject.employees[1].Name;
    document.getElementById(
    "sp_age").innerHTML = JsonObject.employees[1].Age;
    document.getElementById(
    "sp_address").innerHTML = JsonObject.employees[1].Address;
    document.getElementById(
    "sp_phone").innerHTML = JsonObject.employees[1].Phone;
    </script>

    <p>
    FirstName:<span id="sp_firstname"></span><br />
    LastName:<span id="sp_lastname"></span>
    </p>
    <script type="text/javascript">
    document.getElementById(
    "sp_firstname").innerHTML = obj.employees[0].FirstName;
    document.getElementById(
    "sp_lastname").innerHTML = obj.employees[0].LastName;
    </script>
    </div>
    </form>
    </body>
    </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
     public class JsonHelper
    {
    /// <summary>
    /// json序列号
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="t"></param>
    /// <returns></returns>
    public static string JsonSerializa<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();
    return jsonstring;
    }


    /// <summary>
    /// json反序列化
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="strjson"></param>
    /// <returns></returns>
    public static T JsonDeserializa<T>(string strjson)
    {
    DataContractJsonSerializer zer = new DataContractJsonSerializer(typeof(T));
    MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(strjson));
    T obj = (T)zer.ReadObject(ms);
    return obj;
    }
    }

    person类:

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

    简单实现:

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

    string json = JsonHelper.JsonSerializa<Person>(p);
    Response.Write(json);
    }

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

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

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

    View Code
    using System.Runtime.Serialization.Json;
    using System.IO;
    using System.Text;
    using System.Text.RegularExpressions;
    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)\/");
  • 相关阅读:
    SeaweedFS上手使用指南
    XyTalk企业即时通讯IM开始开源
    大数据项目相关技术栈(Hadoop周边技术)
    Hive SQL基础操作
    Applet Mode
    快速开始
    NetBeans启动Tomcat报“'127.0.0.1' 不是内部或外部命令”启动失败的解决办法
    运行带distance field的Hiero
    Game Loop的几种实现方式
    20150408
  • 原文地址:https://www.cnblogs.com/aces/p/Ace_Jsontest.html
Copyright © 2020-2023  润新知