c# 生成json数据包
json数据类型,归根到底就是一个字符串,管他里面什么格式,它就是一个字符串来的!
看一个json数据包:
{ "touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url":"http://weixin.qq.com/download", "topcolor":"#FF0000", "data": { "User": { "value":"黄先生", "color":"#173177" }, "Date":{ "value":"06月07日 19时24分", "color":"#173177" }, "CardNumber":{ "value":"0426", "color":"#173177" }, "Type":{ "value":"消费", "color":"#173177" }, "Money":{ "value":"人民币260.00元", "color":"#173177" }, "DeadTime":{ "value":"06月07日19时24分", "color":"#173177" }, "Left":{ "value":"6504.09", "color":"#173177" } } }
你可以直接赋值一个string对象:
string json = "{\"touser\":\"OPENID\",.......}";
遇到双引号要使用转义“\”进行转义。这样弄出来的一个string对象就是一个json数据包了。
这样直接赋值麻烦,在网上找了找,为了生成上面这样的json,弄到了下面几个类:
PayTemplateHeader.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace tenpay { [DataContract] public class PayTemplateHeader { public PayTemplateHeader() { } public PayTemplateHeader(string template_id, string touser, string url) { this.template_id = template_id; this.touser = touser; this.url = url; } /// <summary> /// 模板ID /// </summary> [DataMember] public string template_id { get; set; } /// <summary> /// 微信接收信息用户的openid /// </summary> [DataMember] public string touser { get; set; } /// <summary> /// 信息点击链接 /// </summary> [DataMember] public string url { get; set; } } }
PayTemplate.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; namespace tenpay { /// <summary> /// 微信充值模板接口请求实体对象 /// </summary> [DataContract] public class PayTemplate { public PayTemplate() { } /// <summary> /// 您好,您已成功进行某游戏币充值。 /// </summary> [DataMember] public string first { get; set; } /// <summary> /// 帐号:kantzou /// </summary> [DataMember] public string accountType { get; set; } /// <summary> /// 帐号:kantzou /// </summary> [DataMember] public string account { get; set; } /// <summary> /// 获得游戏币:500点 /// </summary> [DataMember] public string productType { get; set; } /// <summary> /// 获得游戏币:500点 /// </summary> [DataMember] public string number { get; set; } /// <summary> /// 充值金额:50元 /// </summary> [DataMember] public string amount { get; set; } /// <summary> /// 充值状态:充值成功 /// </summary> [DataMember] public string result { get; set; } /// <summary> /// 祝您游戏愉快。 /// </summary> [DataMember] public string remark { get; set; } } }
JSONHelper.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace tenpay { /// <summary> /// json转化类 /// </summary> [Serializable] public class JSONHelper { public static string Serialize<T>(T obj) { System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType()); MemoryStream ms = new MemoryStream(); serializer.WriteObject(ms, obj); string retVal = Encoding.UTF8.GetString(ms.ToArray()); ms.Dispose(); return retVal; } public static T Deserialize<T>(string json) { T obj = Activator.CreateInstance<T>(); MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)); System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType()); obj = (T)serializer.ReadObject(ms); ms.Close(); ms.Dispose(); return obj; } } }
public class DataFormat { public string value { get; set; } public string color { get; set; } } public class DataFormatList { public List<DataFormat> first { get; set; } public List<DataFormat> accountType { get; set; } public List<DataFormat> account { get; set; } public List<DataFormat> productType { get; set; } public List<DataFormat> number { get; set; } public List<DataFormat> amount { get; set; } public List<DataFormat> result { get; set; } public List<DataFormat> remark { get; set; } }
/// <summary> /// 微信充值模板接口json参数整理 /// </summary> /// <param name="PayTemplate">微信充值模板接口参数实例</param> /// <returns></returns> public string getPayTemplateJson(PayTemplateHeader header, PayTemplate template,string color) { string jsonH = JSONHelper.Serialize<PayTemplateHeader>(header); DataFormatList dataformatlist = new DataFormatList(); dataformatlist.first = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.first),color=color}}; dataformatlist.accountType = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.accountType),color=color}}; dataformatlist.account = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.account),color=color}}; dataformatlist.productType = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.productType),color=color}}; dataformatlist.number = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.number),color=color}}; dataformatlist.amount = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.amount),color=color}}; dataformatlist.result = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.result),color=color}}; dataformatlist.remark = new List<DataFormat>(){ new DataFormat(){value=ConvertGBK(template.remark),color=color}}; string jsonD = new JavaScriptSerializer().Serialize(dataformatlist); string json = jsonH.Insert(jsonH.Length - 1, ",\"data\":" + jsonD.Replace("[", "").Replace("]", "")); return json; } private string ConvertGBK(string p) { byte[] byteArray = Encoding.UTF8.GetBytes(p); return Encoding.GetEncoding("GBK").GetString(byteArray); }
调用例子:
PayTemplateHeader header = new PayTemplateHeader(); header.template_id = "jrciIIcHIYLJujC7FyqSiKyGGWnLok6VQJ1a81p1HLw"; header.touser = "openid123"; header.url = "http://www.baidu.com/App/Pay/1.aspx"; PayTemplate paytemplate = new PayTemplate(); paytemplate.first = "您好,您已成功进行某游戏币充值。"; paytemplate.accountType = "账号"; paytemplate.account = "k6780384"; paytemplate.productType = "游戏币"; paytemplate.number = "500点"; paytemplate.amount = "50元"; paytemplate.result = "充值成功"; paytemplate.remark = "祝您游戏愉快"; TenpayUtil tenpay = new TenpayUtil(); string post_data = tenpay.getPayTemplateJson(header, paytemplate, "#173177"); Response.Write(post_data);
输出:
哎,乱码了,不管了,只要微信那边不是乱码就好。