You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

259 lines
8.1 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Data;
using System.Text;
using System.IO;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using System.Collections;
using Newtonsoft.Json.Converters;
namespace DSWeb.MvcShipping.Helper
{
public class JsonConvert
{
public static T Deserialize<T>(string json)
{
T obj = Activator.CreateInstance<T>();
var jsonObj = json;
if (json == null)
jsonObj = string.Empty;
obj = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(jsonObj);
return obj;
}
public static string Serialize<T>(T obj)
{
string retVal = string.Empty;
IsoDateTimeConverter timeConverter = new IsoDateTimeConverter();
//这里使用自定义日期格式如果不使用的话默认是ISO8601格式
timeConverter.DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
//jsonObject是准备转换的对象
retVal = Newtonsoft.Json.JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented, timeConverter);
return retVal;
}
#region 转化Dataset or DataTable
#region 直接转为Json字符串
public static string DataTableToJSON(DataTable dt, string dtName)
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter jw = new JsonTextWriter(sw))
{
JsonSerializer ser = new JsonSerializer();
jw.WriteStartObject();
jw.WritePropertyName(dtName);
jw.WriteStartArray();
foreach (DataRow dr in dt.Rows)
{
jw.WriteStartObject();
foreach (DataColumn dc in dt.Columns)
{
jw.WritePropertyName(dc.ColumnName);
ser.Serialize(jw, dr[dc].ToString());
}
jw.WriteEndObject();
}
jw.WriteEndArray();
jw.WriteEndObject();
sw.Close();
jw.Close();
}
return sb.ToString();
}
#endregion
#region 转化为Controller中可以使用Json(new {..})使用的方式
#region 例子
//public static Dictionary<string, object> getTable()
//{
// string sql = "select user_name, active_indicator, create_date from users";
// string connString = "database=db; server=localhost; user id=sa;";
// return JsonMethods.ToJson(GetDataTable(sql, connString));
//}
//private static DataTable GetDataTable(string sql, string connString)
//{
// using (SqlConnection myConnection = new SqlConnection(connString))
// {
// using (SqlCommand myCommand = new SqlCommand(sql, myConnection))
// {
// myConnection.Open();
// using (SqlDataReader myReader = myCommand.ExecuteReader())
// {
// DataTable myTable = new DataTable();
// myTable.TableName = "mydt";
// myTable.Load(myReader);
// myConnection.Close();
// return myTable;
// }
// }
// }
//}
//Controller中 return Json(new {data=getTable().ToArray()});
#endregion
private static List<Dictionary<string, object>> RowsToDictionary(DataTable table)
{
List<Dictionary<string, object>> objs =
new List<Dictionary<string, object>>();
if (table == null)
return objs;
foreach (DataRow dr in table.Rows)
{
Dictionary<string, object> drow = new Dictionary<string, object>();
for (int i = 0; i < table.Columns.Count; i++)
{
drow.Add(table.Columns[i].ColumnName, dr[i]);
}
objs.Add(drow);
}
return objs;
}
/// <summary>
/// 把DataTable转化为Controller可以转为Json数据的数据集合
/// </summary>
/// <param name="table">需要转换的DataTable</param>
/// <returns></returns>
public static List<Dictionary<string, object>> ToJson(DataTable table)
{
return RowsToDictionary(table);
}
//public static Dictionary<string, object> ToJson(DataTable table)
//{
// Dictionary<string, object> dict = new Dictionary<string, object>();
// dict.Add(table.TableName, RowsToDictionary(table));
// return dict;
//}
/// <summary>
/// 把DataSet转化为Controller可以转为Json数据的数据集合
/// </summary>
/// <param name="data">需要转换的DataSet</param>
/// <returns></returns>
public static Dictionary<string, object> ToJson(DataSet data)
{
Dictionary<string, object> dict = new Dictionary<string, object>();
foreach (DataTable table in data.Tables)
{
dict.Add(table.TableName, RowsToDictionary(table));
}
return dict;
}
#endregion
#endregion
static public object JsonGetValue(string jsondata,string jsonname)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> json = (Dictionary<string, object>)serializer.DeserializeObject(jsondata);
object value;
if (!json.TryGetValue(jsonname, out value))
{
throw new Exception("数据中不存在此值!");
}
return value;
}
/// <summary>
/// 获取JsonString
/// </summary>
/// <param name="ds">DataSet</param>
/// <returns></returns>
public static string GetJsonString(DataSet ds)
{
string res = ""; ;
IList<Hashtable> mList = new List<Hashtable>();
try {
foreach (DataRow row in ds.Tables[0].Rows)
{
Hashtable ht = new Hashtable();
foreach (DataColumn col in ds.Tables[0].Columns)
{
ht.Add(col.ColumnName, row[col.ColumnName]);
}
mList.Add(ht);
}
res = Newtonsoft.Json.JsonConvert.SerializeObject(mList);
}
catch (Exception ee)
{
string error = ee.Message;
}
return res;
}
}
public class JsonConvert_extend<T> where T : HcUtility.Core.ModelObjectBill
{
public static List<T> Deserialize(Microsoft.Practices.EnterpriseLibrary.Data.Database db, string json)
{
var result = new List<T>();
var jsonObj = json;
if (json == null)
{
jsonObj = string.Empty;
}
else
{
var Dlist = JsonConvert.Deserialize<List<Dictionary<string, string>>>(json);
T objbase = Activator.CreateInstance<T>();
objbase.GetTableField(db);
foreach (var dt in Dlist)
{
T obj = Activator.CreateInstance<T>();
obj.SaveDic = objbase.SaveDic;
obj.SetValue(dt);
result.Add(obj);
}
}
return result;
}
}
}
//public class CustomerJsonConverter : JsonConverter
//{
// public override void WriteJson(JsonWriter writer, object value)
// {
// throw new NotImplementedException();
// }
// public override object ReadJson(JsonReader reader, Type objectType)
// {
// throw new NotImplementedException();
// }
// public override bool CanConvert(Type objectType)
// {
// return true;
// }
//}