Json反序列化数组的问题

jiyouyou 2012-12-12 11:07:25
我现在要输出一个json数组 里边就是文章标题和内容,内容里是有html样式的,而且很多的
网上找了一个JsonHelper类

public class JsonHelper
{
/// <summary>
/// JSON序列化
/// 将泛型list对象转换成JSON类型串
/// <param name="t">对象(实体对象或其他对象)</param>
/// </summary>
public static string JsonSerializer_to_Json<T>(T t)
{

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));

MemoryStream ms = new MemoryStream();

ser.WriteObject(ms, t);

string jsonString = Encoding.UTF8.GetString(ms.ToArray());

ms.Close();

//替换Json的Date字符串

string p = @"\\/Date\((\d+)\+\d+\)\\/";

MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDateToDateString);

Regex reg = new Regex(p);

jsonString = reg.Replace(jsonString, matchEvaluator);

return jsonString;

}
/// <summary>
/// JSON反序列化
/// 将JSON类型串转换成泛型list对象
/// <param name="jsonString">json格式的字符串</param>
/// </summary>
public static T JsonDeserialize_JsonTo<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);

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));

MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));

T obj = (T)ser.ReadObject(ms);

return obj;
}

/// <summary>
/// 将Json序列化的时间由/Date(1294499956278+0800)转为字符串
/// </summary>
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;

}
/// <summary>
/// 将时间字符串转为Json时间
/// </summary>
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;

}
/// <summary>
/// 将泛型list对象转换成JSON类型串(二)
/// </summary>
/// <typeparam name="T">对象类型或实体类型</typeparam>
/// <param name="jsonName">对该对象起名字</param>
/// <param name="IL">Ilist对象</param>
/// <returns></returns>
public static string ObjectToJson<T>(string jsonName, IList<T> IL)
{
StringBuilder Json = new StringBuilder();
Json.Append("{\"" + jsonName + "\":[");
if (IL.Count > 0)
{
for (int i = 0; i < IL.Count; i++)
{
T obj = Activator.CreateInstance<T>();
Type type = obj.GetType();
PropertyInfo[] pis = type.GetProperties();
Json.Append("{");
for (int j = 0; j < pis.Length; j++)
{
Json.Append("\"" + pis[j].Name.ToString() + "\":\"" + pis[j].GetValue(IL[i], null) + "\"");
if (j < pis.Length - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (i < IL.Count - 1)
{
Json.Append(",");
}
}
}
Json.Append("]}");
return Json.ToString();
}

/// <summary>
/// 将数据表转换成JSON类型串
/// </summary>
/// <param name="dt">要转换的数据表</param>
/// <returns></returns>
public static StringBuilder DataTableToJSON(System.Data.DataTable dt)
{
return DataTableToJSON(dt, true);
}

/// <summary>
/// 将数据表转换成JSON类型串
/// </summary>
/// <param name="dt">要转换的数据表</param>
/// <param name="dispose">数据表转换结束后是否dispose掉</param>
/// <returns></returns>
public static StringBuilder DataTableToJSON(System.Data.DataTable dt, bool dt_dispose)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("[");

//数据表字段名和类型数组
string[] dt_field = new string[dt.Columns.Count];
int i = 0;
string formatStr = "{{";
string fieldtype = "";
foreach (System.Data.DataColumn dc in dt.Columns)
{
dt_field[i] = dc.Caption.ToLower().Trim();
formatStr += '"' + dc.Caption.ToLower().Trim() + '"' + ":";
fieldtype = dc.DataType.ToString().Trim().ToLower();
if (fieldtype.IndexOf("int") > 0 || fieldtype.IndexOf("deci") > 0 ||
fieldtype.IndexOf("floa") > 0 || fieldtype.IndexOf("doub") > 0 ||
fieldtype.IndexOf("bool") > 0)
{
formatStr += "{" + i + "}";
}
else
{
formatStr += '"' + "{" + i + "}" + '"';
}
formatStr += ",";
i++;
}

if (formatStr.EndsWith(","))
{
formatStr = formatStr.Substring(0, formatStr.Length - 1);//去掉尾部","号
}
formatStr += "}},";

i = 0;
object[] objectArray = new object[dt_field.Length];
foreach (System.Data.DataRow dr in dt.Rows)
{

foreach (string fieldname in dt_field)
{ //对 \ , ' 符号进行转换
objectArray[i] = dr[dt_field[i]].ToString().Trim().Replace("\\", "\\\\").Replace("'", "\\'").Replace("\n", "");
switch (objectArray[i].ToString())
{
case "True":
{
objectArray[i] = "true"; break;
}
case "False":
{
objectArray[i] = "false"; break;
}
default: break;
}
i++;
}
i = 0;
stringBuilder.Append(string.Format(formatStr, objectArray));
}
if (stringBuilder.ToString().EndsWith(","))
{
stringBuilder.Remove(stringBuilder.Length - 1, 1);//去掉尾部","号
}

if (dt_dispose)
{
dt.Dispose();
}
return stringBuilder.Append("]");
}

/// <summary>
/// datatable分页
/// </summary>
/// <param name="dt"></param>
/// <param name="PageIndex"></param>
/// <param name="PageSize"></param>
/// <returns></returns>
public static DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{

if (PageIndex == 0)
return dt;
DataTable newdt = dt.Clone();

int rowbegin = (PageIndex - 1) * PageSize;
int rowend = PageIndex * PageSize;

if (rowbegin >= dt.Rows.Count)
return newdt;

if (rowend > dt.Rows.Count)
rowend = dt.Rows.Count;
for (int i = rowbegin; i <= rowend - 1; i++)
{
DataRow newdr = newdt.NewRow();
DataRow dr = dt.Rows[i];
foreach (DataColumn column in dt.Columns)
{
newdr[column.ColumnName] = dr[column.ColumnName];
}
newdt.Rows.Add(newdr);
}

return newdt;
}
/// <summary>
/// 返回有效名称
/// </summary>
/// <param name="unName"></param>
/// <param name="unEnName"></param>
/// <returns></returns>
public static string GetValidateName(string firName, string secEnName)
{
string strName = "";
if (!String.IsNullOrEmpty(firName))
{
strName = firName;
}
else
{
if (!String.IsNullOrEmpty(secEnName))
{
strName = secEnName;
}
}
return strName;
}


}

现在是查询库中返回DataTable,然后给这个类序列化一下是能输出出来的,但是那边接收的时候,怎么还能拿DataTable来接收呢?
  DataTable dt =JsonHelper.JsonDeserialize_JsonTo<DataTable>(json);

再拿这个接收json时反序列化提示
所需的命名空间“”中的结尾元素“root”。找到 命名空间“”中的元素“item”。
谁用过这个类呢。。
...全文
293 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xwbb123 2012-12-13
  • 打赏
  • 举报
回复
那你可以序列化成 list<类> 啊,不一定非要用datatable啊, 实在不行 你在把list 转成datatable 就行了
jiyouyou 2012-12-13
  • 打赏
  • 举报
回复
引用 2 楼 xwbb123 的回复:
那你可以序列化成 list<类> 啊,不一定非要用datatable啊, 实在不行 你在把list 转成datatable 就行了
因为发来的json是个数组,不是一个集合,而且用list<T>接收时数组里的集合的键多了,也会报错,我试了发2,3个键的数组就没事,json里边的键都不能为空么?
jiyouyou 2012-12-13
  • 打赏
  • 举报
回复
引用 1 楼 yaotomo 的回复:
客户端能用datatable? 反序列化用javascript的eval函数或者jQuery的ParseJSON方法
我是在后台接收处理的,想弄成datatable数据源,然后绑定控件
yaotomo 2012-12-12
  • 打赏
  • 举报
回复
客户端能用datatable? 反序列化用javascript的eval函数或者jQuery的ParseJSON方法

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧