1. 程式人生 > >C#——物件轉換為JSON格式的字串

C#——物件轉換為JSON格式的字串

問題來源

這幾日正值伏天,我發現成都不是下大雨就是烈日炎炎的天氣。七月上旬車子也壞掉了,去南門體育管健身房要走20來分鐘,再回到研究院大樓又是20多分鐘,一路上不是大雨就是烈日,還好鍛鍊後多巴胺讓我持續維持一天極好的心情。實驗室實在涼快,下面趁著休息總結一下今天所學——我們的專案需要從頁面接受JSON格式的字串,並把它傳送給後臺伺服器。

例項分析

JSON的基礎知識就不在這裡贅述,可以參考這裡。今天的主題是:如何把物件轉化為JSON? 轉換之前首先看下面的說明。

1. C#或C++等程式語言中的class、struct等可以認為是資料結構,它們存放類的屬性和方法,一般類都有資料成員。

2. JSON是一種輕量級的文字資料交換格式,它存放資料。JSON 最常見的用法之一,是從 web 伺服器上讀取 JSON 資料(作為檔案或作為 HttpRequest),將 JSON 資料轉換為 JavaScript 物件,然後在網頁中使用該資料。

那麼如何將物件轉化為JSON呢?實質上就是資料和類的關係,既然JSON存放資料,類也可以存放資料,那麼它們肯定可以相互轉化,並且在實際專案中需要我們把類物件轉化為JSON,方便資料在網路上傳輸。。。

1. 首先我們建立一個MyInfo類,該類資料成員儲存姓名,性別及年齡,並在該類中定義構造方法。程式碼如下:

public class MyInfo {
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public MyInfo(string Name, string Sex, int Age) 
        {
            this.Name = Name;
            this.Sex = Sex;
            this.Age = Age;
        }

        public MyInfo(string Name) {
            this.Name = Name;
        }
    }
2. 如何轉換為JSON?我利用類儲存資料,把類中資料轉換到JSON中,其實這很簡單,我們可使用.net封裝好的方法,獲取JSON的程式碼如下:
public static string GetJson(MyInfo myInfo)
        {
            StringBuilder stringBuilder = new StringBuilder();
            JavaScriptSerializer json = new JavaScriptSerializer();
            json.Serialize(myInfo, stringBuilder);
            return stringBuilder.ToString();

            // 和下面的程式碼有同樣的效果
            //JavaScriptSerializer json = new JavaScriptSerializer();
            //return json.Serialize(myInfo);
        }

GetJson方法的引數是MyInfo例項,是因為我們要把類物件轉換為JSON。資料的輸入是類物件,輸出(即返回值)是我們想要的JSON格式的字串。這裡需要注意的是:使用JavaScriptSerializer前需要在程式碼中引入:

using System.Web.Script.Serialization;//須引用~Framework\v3.5\System.Web.Extensions.dll。

完整程式碼如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Script.Serialization;//須引用 ~Framework\v3.5\System.Web.Extensions.dll

namespace ToJson
{
    public class MyInfo {
        public string Name { get; set; }
        public string Sex { get; set; }
        public int Age { get; set; }
        public MyInfo(string Name, string Sex, int Age) 
        {
            this.Name = Name;
            this.Sex = Sex;
            this.Age = Age;
        }

        public MyInfo(string Name) {
            this.Name = Name;
        }
    }
    class Test
    {
        public static string GetJson(object o)
        {
            JavaScriptSerializer json = new JavaScriptSerializer();
            return json.Serialize(o);
        }

        // 物件--->JSON
        public static string GetJson(MyInfo myInfo)
        {
            StringBuilder stringBuilder = new StringBuilder();
            JavaScriptSerializer json = new JavaScriptSerializer();
            json.Serialize(myInfo, stringBuilder);
            return stringBuilder.ToString();

            // 和下面的程式碼有同樣的效果
            //JavaScriptSerializer json = new JavaScriptSerializer();
            //return json.Serialize(myInfo);
        }
       
        static void Main(string[] args)
        {
            // 
            List<int> list = new List<int>();
            for (int i = 0; i < 10; i++ )
            {
                list.Add(i);
            }
            string json = GetJson(list);
            Console.Write(json);

            Console.Write("\n");

            //
            string myInfoJson = GetJson(new MyInfo("小明","男",18) );
            Console.Write(myInfoJson);

            string myInfoJson1 = GetJson(new MyInfo("小明"));
            Console.Write(myInfoJson1);

            Console.ReadLine();
        }
    }
}
執行結果如下圖所示:

在專案中的運用

這裡我假想一下:大家在淘寶買寶貝,我們在點選付款按鈕後頁面會把我們的資料資訊反饋給淘寶後臺,這其中應該使用了JSON傳輸資料,並且使用MSMQ技術,哈哈~~假想下。在這篇文章中曾經提到如何使用MSMQ技術傳送或接受JSON格式的訊息。七月份做的這個專案需要在網站頁面上獲取資料,並把資料以JSON格式傳遞給後臺。這裡我們先瀏覽一下用於學習的程式碼:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Script.Serialization;//須引用 ~Framework\v3.5\System.Web.Extensions.dll

namespace ToJson
{
    public class ClientMessage
    {
        public string Message { get; set; }
        public int Code { get; set; }
        public bool IsList { get; set; }
        public string Result { get; set; }
        public string MethodName { get; set; }
        public string Remark { get; set; }
        public object Obj { get; set; }
        public ClientMessage() { }

        public ClientMessage(string Message, int Code, bool IsList, string Result, string MethodName)
        {
            this.Message = Message;
            this.Code = Code;
            this.IsList = IsList;
            this.Result = Result;
            this.MethodName = MethodName;

        }
        public ClientMessage(bool IsList, string Result, string Message)
        {
            this.IsList = IsList;
            this.Result = Result;
            this.Message = Message;

        }
        public ClientMessage(bool IsList, string Result, string Message, string Remark)
        {
            this.IsList = IsList;
            this.Result = Result;
            this.Message = Message;
            this.Remark = Remark;
        }
    }

    class Program
    {
        public static string ToJson(object o, ClientMessage message)
        {
            StringBuilder builder = new StringBuilder();
            JavaScriptSerializer servializer = new JavaScriptSerializer();
            string json = servializer.Serialize(o);

            builder.Append("{");
            builder.Append("\"Message\":");
            builder.Append(" \" "+ message.Message +" \" ");
            builder.Append(",");
            builder.Append(" \"list\": ");
            if (message.IsList == false)
            {
                builder.Append("[");
                builder.Append(json);
                builder.Append("]");
            }
            else
                builder.Append(json);
            builder.Append(",");
            builder.Append("\"Result\":");
            builder.Append("\"" + message.Result + "\"");
            builder.Append("}");
            return builder.ToString();
        }
        static void Main(string[] args)
        {
            List<int> list = new List<int>();
            for (int i = 0; i < 10; i++)
            {
                list.Add(i);
            }

            string json =  Program.ToJson(list, new ClientMessage(true, "成功", "輸出你想要的string型別的訊息"));
            Console.Write(json);

            Console.ReadLine();
        }
    }
}
執行結果為:

分析:ClientMessage類存放我們配電室運維專案抽象出來的電氣裝置共有的的屬性資訊,我們要把類中資料成員轉換為JSON。細心的小夥伴可以看出來string ToJson(object o, ClientMessage message)這個函式主體和上面的物件轉換JSON的函式不太一樣,其實它們本質是一樣的,上面的使用封裝好的方法,下面直接以原始碼的方式呈現給我們,這樣我們會有更多的機會來獲取我們想要的JSON資料字串;記住,你可以在函式體中寫任何程式碼,前提是程式碼符合你想要資料。這裡object o我使用List做測試,實際中它可以是電氣裝置的各種屬性,裝置型別或者裝置的採集模組列表(類)等。

總結

看完這篇文章,你應該掌握:

1. 如何將物件轉換為JSON? 

2. 為什麼要轉換?

2. 如何將物件轉換為適應我們專案的JSON?