使用Json.NET來序列化所需的數據

来源:http://www.cnblogs.com/shouce/archive/2016/04/21/5415493.html
-Advertisement-
Play Games

我們在做開發的時候,很多時候需要和Json數據格式打交道,如Web開發裡面,很多時候,數據通過Json進行傳遞到頁面上,然後在進行處理的。而使用Json的時候,我們很多時候會涉及到幾個序列化對象的使用:DataContractJsonSerializer,JavaScriptSerializer 和 ...


我們在做開發的時候,很多時候需要和Json數據格式打交道,如Web開發裡面,很多時候,數據通過Json進行傳遞到頁面上,然後在進行處理的。而使用Json的時候,我們很多時候會涉及到幾個序列化對象的使用:DataContractJsonSerializer,JavaScriptSerializer Json.NET。大多數人都會選擇性能以及通用性較好Json.NET,這個不是微軟的類庫,但是一個開源的世界級的Json操作類庫,從下麵的性能對比就可以看到它的其中之一的性能優點。

Json.NET能很好序列化或者反序列化.NET的各種類型數據,而且它的另一個優點,是可以配置Attribute屬性,指定輸出的屬性的名稱或者是否輸出,這點我非常喜歡。

JSON(JavaScript Object Notation,JavaScript對象表示法)是一種輕量級的數據交換格式。JSON是“名值對”的集合。結構由大括弧'{}',中括弧'[]',逗號',',冒號':',雙引號'“”'組成,包含的數據類型有Object,Number,Boolean,String,Array, NULL等。

1、在Web中使用Json數據

 在我的基於MVC+EasyUI的Web開發框架中,Web界面層大量使用了Ajax方式獲取所需數據,然後綁定到樹列表控制項或者其他界面控制項裡面,在前面的一些Web框架隨筆系列裡面,我介紹過很多Json格式的操作。

1)基於MVC4+EasyUI的Web開發框架經驗總結(3)- 使用Json實體類構建菜單數據

2)基於MVC4+EasyUI的Web開發框架經驗總結(2)- 使用EasyUI的樹控制項構建Web界面

如在MVC的視圖裡面,通過Web請求的Json數據後初始化樹控制項的代碼如下所示

複製代碼
    //初始化組織機構列表
    function initDeptTreeview() {
        $("#loading").show();

        $('#treeDept').tree({
            url: '/User/GetMyDeptTreeJson?userId=@Session["UserId"]',
            onClick: function (node) {
                loadDataByOu(node.id);
            }
          });

        $("#loading").fadeOut(500);
    }
複製代碼

或者用戶角色的初始化界面代碼

                $('#lbxRoles').empty();
                $.getJSON("/Role/GetRolesByUser?r=" + Math.random() + "&userid=" + info.ID, function (json) {
                    $.each(json, function (i, item) {
                        $('#lbxRoles').append('<option value="' + item.ID + '">' + item.Name + '</option>');
                    });
                });

 

前面說過,Json.NET具有屬性配置功能,可以指定某個屬性是否輸出,或者輸出的名稱轉義等。預設情況下,Json.Net序列化後結果中的欄位名稱和類中屬性的名稱一致,如果想自定義序列化後的欄位名稱,可以使用JsonProperty。

我們知道,EasyUI的Tree控制項裡面,它的數據格式,除了一個id和text是必須的之外,它的很多屬性是可選的,也就是說在Json裡面,可以不輸出某個屬性的內容。這個通過配置

[JsonProperty( NullValueHandling = NullValueHandling.Ignore)]

就可以忽略某個屬性的輸出了,如果這個屬性的值為null的話。

樹控制項的數據還有一個checked屬性, 如果沒有轉義功能,我們需要指定屬性為checked, 而checked是C#裡面的保留關鍵字,不能使用,那麼就沒辦法了。而Json.NET提供了轉義功能的配置Attribute,很好解決問題,如下所示。

        [JsonProperty(PropertyName = "checked", NullValueHandling = NullValueHandling.Ignore)]
        public bool? Checked { get; set; }

因此整個EasyUI的Tree數據對象信息,在C#裡面可以定義為如下所示(這裡可以忽略DataContract、DataMember的定義)。

複製代碼
    /// <summary>
    /// 定義EasyUI樹的相關數據,方便控制器生成Json數據進行傳遞
    /// </summary>
    [DataContract]
    [Serializable]
    public class EasyTreeData
    {
        /// <summary>
        /// ID
        /// </summary>
        [DataMember]
        public string id { get; set; }

        /// <summary>
        /// 節點名稱
        /// </summary>
        [DataMember]
        public string text { get; set; }
        
        /// <summary>
        /// 是否展開
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        [DataMember]
        public string state  { get; set; }

        /// <summary>
        /// 圖標樣式
        /// </summary>
        [DataMember]
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
public string iconCls { get; set; }

        [JsonProperty(PropertyName = "checked", NullValueHandling = NullValueHandling.Ignore)]
        [DataMember(Name="checked")]
        public bool? Checked { get; set; }


        /// <summary>
        /// 子節點集合
        /// </summary>
        [DataMember]
        public List<EasyTreeData> children { get; set; }
複製代碼

使用上的實體類,並使用Json.NET來序列化我們的數據,我們可能得到下麵的Json數據。

複製代碼
[
 {
    id: "-1",
    text: "",
    state: "open",
checked: true, children: [ ] }, { id:
"6", text: "總經辦", state: "open", iconCls: "icon-group", children: [ ] } ]
複製代碼

我們從上面的Json數據可以看到,Checked屬性順利轉換為checked的名稱屬性,標記為[JsonProperty(NullValueHandling = NullValueHandling.Ignore)] ,而值為null的屬性,將不會出現在Json的字元串裡面了。

這個在某種情形下,正好就是我們所需要的。 

2、在微信介面開發中使用Json

微信API的介面,大量使用了Json數據,不僅很多返回的數據是使用Json表達,而且其Post的數據,也多數使用Json數據格式,如在我的前兩篇隨筆《C#開發微信門戶及應用(5)--用戶分組信息管理》 、《C#開發微信門戶及應用(4)--關註用戶列表及詳細信息管理

裡面介紹的內容,微信的很多介面都使用了Json數據。

如返回關註者列表的Json數據,就是如下所示。

{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}

創建用戶分組,返回的數據格式如下,同樣也是Json數據。

{
    "group": {
        "id": 107, 
        "name": "test"
    }
}

通過下麵基於Json.NET的Json數據的轉換,就可以順利從Json字元串轉換為相應的實體對象了。

複製代碼
    /// <summary>
    /// Json字元串操作輔助類
    /// </summary>
    public class JsonHelper<T> where T : class, new()
    {
        /// <summary>
        /// 檢查返回的記錄,如果返回沒有錯誤,或者結果提示成功,則不拋出異常
        /// </summary>
        /// <param name="content">返回的結果</param>
        /// <returns></returns>
        private static bool VerifyErrorCode(string content)
        {
            if (content.Contains("errcode"))
            {
                ErrorJsonResult errorResult = JsonConvert.DeserializeObject<ErrorJsonResult>(content);
                //非成功操作才記錄異常,因為有些操作是返回正常的結果({"errcode": 0, "errmsg": "ok"})
                if (errorResult != null && errorResult.errcode != ReturnCode.請求成功)
                {
                    string error = string.Format("微信請求發生錯誤!錯誤代碼:{0},說明:{1}", (int)errorResult.errcode, errorResult.errmsg);
                    LogTextHelper.Error(errorResult);

                    throw new WeixinException(error);//拋出錯誤
                }
            }
            return true;
        }

        /// <summary>
        /// 轉換Json字元串到具體的對象
        /// </summary>
        /// <param name="url">返回Json數據的鏈接地址</param>
        /// <returns></returns>
        public static T ConvertJson(string url)
        {
            HttpHelper helper = new HttpHelper();
            string content = helper.GetHtml(url);
            VerifyErrorCode(content);

            T result = JsonConvert.DeserializeObject<T>(content);
            return result;
        }
}
複製代碼

而如果要把對象轉換為Json字元串格式的數據,那麼代碼也很簡單。

JsonConvert.SerializeObject(obj, Formatting.Indented);

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介: Pptpd 快速搭建 VPN 伺服器。 閑話不多說,動手 下載地址: http://hivelocity.dl.sourceforge.net/project/poptop/pptpd/pptpd-1.4.0/pptpd-1.4.0.tar.gz 1、安裝 2、配置 ## 其餘沒有標記的全為 ...
  • Qt Creator 你必須要掌握的快捷操作 多使用快捷鍵能顯著提高工作效率,儘可能減少鍵盤,滑鼠之間切換所浪費的時間。我這裡列出個人認為非常重要必須掌握的 Qt Creator 快捷鍵。看你知道幾個? Qt Creator 你必須要掌握的快捷操作 多使用快捷鍵能顯著提高工作效率,儘可能減少鍵盤,鼠 ...
  • 一Linux伺服器突然發送不出郵件,檢查了很多地方都沒有發現異常,檢查/var/log/maillog發現如下具體信息: Apr 12 00:36:04 mylinux sendmail[4685]: u3BGa4Is004685: Authentication-Warning: mylinux.x... ...
  • DNS伺服器介紹 DNS是電腦功能變數名稱系統(Domain Name System 或Domain Name Service) 的縮寫,它是由功能變數名稱解析器和功能變數名稱伺服器組成的。功能變數名稱伺服器是指保存有該網路中所有主機的功能變數名稱和對應IP地址,並具有將功能變數名稱轉換為IP地址功能的伺服器。其中功能變數名稱必須對應一個IP地址,一個... ...
  • 今天學到了很有意思的三個命令:怎麼有意思 快看下圖啦! 這是Ubuntu系統下的三個命令,跟echo本質一樣,但是輸出的字元是圖形的 ,很可愛! 以下是安裝命令: sudo apt-get update;sudo apt-get install sysvbanner sudo apt-get upd ...
  • 磁碟分析 本機的系統盤是C盤,操作系統是Windows 7 專業版,通過磁碟屬性可以看到C盤的已用空間是69.4G。 而我們運行自己編寫的腳本(腳本程式參考附錄,統計原理:計算目錄下各個文件的大小,然後相加,即為該目錄的大小;再將各個目錄占用空間相加,即為總的占用空間),可以發現,占用空間為59G。 ...
  • 由於需要安裝hadoop集群,有10台機器需要安裝,一開始打算用SCP複製,後來覺得不可接受(實際現場可能數倍的機器集群,就是10台也不想乾)。後來在網上找了,發現了clustershell和pssh這兩個工具。這兩個工具隨便用其中一個就可以了。 環境說明:centos6.5機器10台 需求:確定一... ...
  • 我第一次接觸“線程”的概念時,覺得它深奧難懂,看了好多本書,花了很長時間才領悟到它的真諦。現在我就以一個初學者的心態,把我所理解的“多線程”描述給大家。這一次是系列文章,比較完整的展示與線程相關的基本概念。希望對初學者有所幫助。 如果你是高手,請你別繼續看,會浪費你寶貴的時間。 一、基本概念 什麼是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...