JSON序列化问题出在哪???

jiang270606112 2018-12-02 03:29:27

数据协定名称为“DataTable:http://schemas.datacontract.org/2004/07/System.Data”的类型“System.Data.DataTable”不是所需的类型。请考虑使用 DataContractResolver(如果你正在使用 DataContractSerializer),或将任何未知类型以静态方式添加到已知类型的列表。例如,可以使用 KnownTypeAttribute 属性,或者将未知类型添加到传递给序列化程序的已知类型列表。
说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Runtime.Serialization.SerializationException: 数据协定名称为“DataTable:http://schemas.datacontract.org/2004/07/System.Data”的类型“System.Data.DataTable”不是所需的类型。请考虑使用 DataContractResolver(如果你正在使用 DataContractSerializer),或将任何未知类型以静态方式添加到已知类型的列表。例如,可以使用 KnownTypeAttribute 属性,或者将未知类型添加到传递给序列化程序的已知类型列表。

源错误:

行 43: ser.WriteObject(ms, t);
行 44: string jsonString = Encoding.UTF8.GetString(ms.ToArray());
行 45: ms.Close();
行 46: return jsonString;
行 47: }

源文件: F:\Projects.Spread\Projects.Water.Web\Default.aspx.cs 行: 45

 namespace Projects.Water.Web
{
public partial class Default : ExtMemberPage
{
protected void Page_Load(object sender, EventArgs e)
{
RegUserBLL regUserBLL = new RegUserBLL();
aa a = new aa();
a.a = regUserBLL.GetList("*", "status=1");
a.b = 2;
Response.Write(JsonHelpers.JsonSerializer<aa>(a));

}
}
public class aa
{
public object a { get; set; }
public int b { get; set; }
}
public class JsonHelpers
{
#region JsonDeserialize
/// <summary>
/// JSON序列化
/// </summary>
public static string JsonSerializer<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();
return jsonString;
}


/// <summary>
/// JSON反序列化
/// </summary>
public static T JsonDeserialize<T>(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}


#endregion

}
}
...全文
411 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
可以清楚地估计出来,你的所谓
regUserBLL.GetList
这类返回的内容(DataTable容器中的内容)很合可能也有胡乱定义为 object 的子内容。你可能习惯于用空洞的 object 来定义。这些东西都不能自动反序列化。
  • 打赏
  • 举报
回复
public object a { get; set; }
这类要用一个靠谱的强类型,或者是泛型模板方式的定义,而不能滥用空洞的 object 类型。没有什么 json 可以空洞地反序列化为 object,任何对象类型都要具体化。
tobeapger 2018-12-04
  • 打赏
  • 举报
回复
用反射,获取到T的属性名称去和datatable的列名匹配,然后赋值进去
jiang270606112 2018-12-02
  • 打赏
  • 举报
回复
引用 1 楼 吉普赛的歌 的回复:
加一个 datatable 转 json 的方法就好了: https://blog.csdn.net/yenange/article/details/7647119
不是根本的原因。
吉普赛的歌 2018-12-02
  • 打赏
  • 举报
回复
加一个 datatable 转 json 的方法就好了: https://blog.csdn.net/yenange/article/details/7647119

62,025

社区成员

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

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

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

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