jiang270606112 2018-12-01 19:27 采纳率: 0%
浏览 751

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

数据协定名称为“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

    }
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 09:05
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的ASP.NET页面中,你尝试使用DataContractJsonSerializer来序列化和反序列化一个包含aa对象的数组。但是,在序列化时,DataTable对象被转换为System.Data.DataTable,这并不是你想要的类型。你需要确保你在序列化过程中正确地将aa对象转换为正确的类型,这样才能正确地进行序列化和反序列化。

    以下是一个修改后的版本:

    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(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
    }
    

    在这个版本中,我们首先创建了一个新的DataContractJsonSerializer实例,并将其用于序列化和反序列化。然后,我们在序列化方法中调用这个新创建的DataContractJsonSerializer,并使用它来正确地将aa对象转换为正确的类型。最后,我们在反序列化方法中再次使用相同的DataContractJsonSerializer,并将aa对象作为参数传入,以便于反序列化。

    评论

报告相同问题?