引用:System.Runtime.Serialization
/*
今天新开的一个项目突然发现引用System.Runtime.Serialization.Json 提示 命名空间 不存在类型或命名空间名称 json
明明前段时间刚开发的WCF是很正常的引用的,认真比照了引用的文件位置是一样的,记得前段时间在CSDN上也有人抱怨看不到System.Runtime.Serialization.Json
后面发现
首先,当然是项目是3.5的,
只引用一个System.Runtime.Serialization 是不够的,
还要添加
* System.ServiceModel
* System.ServiceModel.Web
的引用,OK
System.Runtime.Serialization.Json 出来了,可以开始对JSON字符串转为实体了。
命名空间 不存在类型或命名空间名称 json
*/
实体
public class Member
{
public int? id { get; set; }
public bool isck { get; set; }
public string name { get; set; }
public DateTime? logintime { get; set; }
public double? price { get; set; }
}
调用
//实例化JsonHelper
JsonHelper _JsonHelper = new JsonHelper();
//实体赋值
Member MemberModel = new Member()
{
id = 1,
isck = false,
name = "guoxianjun",
logintime = DateTime.Now,
price = 1000
};
//[T→Json结果]
string sb = _JsonHelper.SerializeToJson(MemberModel);
//json字符串
string json_member_model = "{\"id\":1,\"isck\":false,\"logintime\":\"2013-03-29 15:12:18\",\"name\":\"guoxianjun\",\"price\":1000}";
//[Json→T结果]
Member table_model = _JsonHelper.DeserializeToObj(json_member_model);
其他案例
member memberentity = new member()
{
m_id = 1,
m_name = "m用户名",
userentity = new user()
{
u_id = 2,
u_name = "u用户名"
}
};
string USERJSON = ComMvcNet.Comm.Extends.JsonHelper.SerializeToJson(memberentity);
string S = "{ \"ppcs_cardsingleactive_add_response\": { \"brand_id\": \"0001\", \"card_id\": 8686860210000003380, \"init_value\": \"100.00\", \"order_id\": \"0000000001\", \"trans_no\": \"0000012979\" } } ";
ppcs_cardsingleactive_add_responseentiy mofn = ComMvcNet.Comm.Extends.JsonHelper.DeserializeToObj(S);
string u = "{ \"ppcs_cardsingletopup_add_response\": { \"order_id\": \"0000000001\", \"trans_no\": \"0000013559\", \"result_info\": { \"card_id\": 8686860210000003231, \"prdt_no\": \"0001\", \"amount\": \"300.00\", \"top_up_way\": 1, \"desn\": \"test -desn\", \"account_balance\": \"29900.20\", \"valid_balance\": \"29900.20\", \"validity_date\": 20111028 } } } ";
ppcs_cardsingletopup_add_responseentity mofcn = ComMvcNet.Comm.Extends.JsonHelper.DeserializeToObj(u);
public class ppcs_cardsingletopup_add_responseentity
{
public ppcs_cardsingletopup_add_response ppcs_cardsingletopup_add_response { get; set; }
}
public class ppcs_cardsingletopup_add_response
{
public string order_id { get; set; }
public string trans_no { get; set; }
public result_info result_info { get; set; }
}
public class result_info
{
public string card_id { get; set; }
public string prdt_no { get; set; }
public double amount { get; set; }
public int? top_up_way { get; set; }
public string desn { get; set; }
public double account_balance { get; set; }
public double valid_balance { get; set; }
public string validity_date { get; set; }
}
public class ppcs_cardsingleactive_add_responseentiy
{
public ppcs_cardsingleactive_add_response ppcs_cardsingleactive_add_response { get; set; }
}
public class ppcs_cardsingleactive_add_response
{
public string brand_id { get; set; }
public string card_id { get; set; }
public double init_value { get; set; }
public string order_id { get; set; }
public string trans_no { get; set; }
}
//[Serializable]
public class member
{
public int? m_id { get; set; }
public string m_name { get; set; }
public user userentity { get; set; }
}
//[Serializable]
public class user
{
public int? u_id { get; set; }
public string u_name { get; set; }
}
T→Json或Json→T方法
using System;
using System.IO;
using System.Runtime.Serialization.Json;
using System.Text.RegularExpressions;
using System.Text;
public class JsonHelper
{
#region T→Json
public string SerializeToJson(T t)
{
using (MemoryStream ms = new MemoryStream())
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
//如果是数组
if (jsonString.StartsWith("[") && jsonString.EndsWith("]"))
{
string name = t.GetType().Name;
if (t is System.Collections.ArrayList)
{
string[] arr = name.Split(new string[] { "[]" }, StringSplitOptions.None);
if (arr.Length > 0) name = arr[0] + "s";
}
else if (t is System.Collections.IList)
{
System.Collections.IList list = (System.Collections.IList)t;
name = list[0].GetType().Name + "s";
}
jsonString = "{\"" + name + "\":" + jsonString + "}";
}
return jsonString;
}
}
#endregion
#region Json→T
public T DeserializeToObj(string jsonString)
{
//将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
T obj = (T)ser.ReadObject(ms);
return obj;
}
}
#endregion
#region 时间转换
private 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;
}
private string ConvertDateStringToJsonDate(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;
}
#endregion
}
全部代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
using System.Text.RegularExpressions;
using System.Runtime.Serialization.Json;
namespace ComMvcNet.Comm.Extends
{
public static class Extends
{
#region 转换成URL参数
/// <summary>
/// 转换成URL参数
/// </summary>
/// <param name="dictionary"></param>
/// <returns></returns>
public static string ToQueryString(this IDictionary<object, object> dictionary)
{
var sb = new StringBuilder();
foreach (var key in dictionary.Keys)
{
var value = dictionary[key];
if (value != null)
{
sb.Append(key + "=" + value + "&");
}
}
return sb.ToString().TrimEnd('&');
}
public static string ToQueryString(this IList<object> list, string key)
{
var sb = new StringBuilder();
foreach (var val in list)
{
if (val != null)
{
sb.Append(key + "=" + Uri.EscapeDataString(val.ToString()) + "&");
}
}
return sb.ToString().TrimEnd('&').Substring(key.Length + 1);
}
#endregion
#region Json/Xml转换对象
public static T ToEntity<T>(this string str) where T : class
{
return ToEntity<T>(str, "json");
}
public static T ToEntity<T>(this string str, object format) where T : class
{
T t = default(T);
switch (format.ToString())
{
case "xml":
{
t = XmlHelper.Deserialize<T>(str);
break;
}
case "json":
default:
{
t = JsonHelper.DeserializeToObj<T>(str);
break;
}
}
return t;
}
#endregion
#region 格林威治时间→DateTime
public static DateTime ToDateTime(this string time)
{
return DateTime.ParseExact(time, "ddd MMM dd HH:mm:ss zzz yyyy", System.Globalization.CultureInfo.InvariantCulture);
}
#endregion
#region 字符串格式化
public static string ToFormat(this string str, params object[] args)
{
return string.Format(str, args);
}
#endregion
}
public class XmlHelper
{
#region XML→T
public static T Deserialize<T>(string xml)
{
if (typeof(T).IsGenericType)
{
return DeserializeToEntityList<T>(xml);
}
else
{
return DeserializeToEntity<T>(xml);
}
}
#endregion
#region XML→T(单例)
private static T DeserializeToEntity<T>(string xml)
{
using (StringReader reader = new StringReader(xml))
{
XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(typeof(T));
T obj = (T)xs.Deserialize(reader);
return obj;
}
}
#endregion
#region XML→T(列表)
private static IList<T> DeserializeToList<T>(string xml)
{
XmlDocument document = new XmlDocument();
document.LoadXml(xml);
string nodeName = typeof(T).Name.ToLower();
IList<T> list = new List<T>();
foreach (XmlNode node in document.GetElementsByTagName(nodeName))
{
list.Add(Deserialize<T>(node.OuterXml));
}
return list;
}
private static T DeserializeToEntityList<T>(string xml)
{
var method = typeof(XmlHelper).GetMethod("DeserializeToList", System.Reflection.BindingFlags.NonPublic| System.Reflection.BindingFlags.Static).MakeGenericMethod(typeof(T).GetGenericArguments()[0]);
return (T)method.Invoke(null, new object[] { xml });
}
#endregion
#region T→XML
public static string Serialize<T>(T obj)
{
string xmlString = string.Empty;
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
xmlSerializer.Serialize(ms, obj);
xmlString = Encoding.UTF8.GetString(ms.ToArray());
}
return xmlString;
}
#endregion
}
public class JsonHelper
{
#region T→Json
public static string SerializeToJson<T>(T t)
{
using (MemoryStream ms = new MemoryStream())
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
ser.WriteObject(ms, t);
string jsonString = Encoding.UTF8.GetString(ms.ToArray());
string p = @"\\/Date\((\d+)\+\d+\)\\/";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
//如果是数组
if (jsonString.StartsWith("[") && jsonString.EndsWith("]"))
{
string name = t.GetType().Name;
if (t is System.Collections.ArrayList)
{
string[] arr = name.Split(new string[] { "[]" }, StringSplitOptions.None);
if (arr.Length > 0) name = arr[0] + "s";
}
else if (t is System.Collections.IList)
{
System.Collections.IList list = (System.Collections.IList)t;
name = list[0].GetType().Name + "s";
}
jsonString = "{\"" + name + "\":" + jsonString + "}";
}
return jsonString;
}
}
#endregion
#region Json→T
public static T DeserializeToObj<T>(string jsonString)
{
//将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"\/Date(1294499956278+0800)\/"格式
string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
Regex reg = new Regex(p);
jsonString = reg.Replace(jsonString, matchEvaluator);
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
T obj = (T)ser.ReadObject(ms);
return obj;
}
}
#endregion
#region 时间转换
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;
}
private static string ConvertDateStringToJsonDate(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;
}
#endregion
}
}