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類,該類資料成員儲存姓名,性別及年齡,並在該類中定義構造方法。程式碼如下:
2. 如何轉換為JSON?我利用類儲存資料,把類中資料轉換到JSON中,其實這很簡單,我們可使用.net封裝好的方法,獲取JSON的程式碼如下: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; } }
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?