如何为 JQUERY 数据表返回 JSON 数据?
Posted
技术标签:
【中文标题】如何为 JQUERY 数据表返回 JSON 数据?【英文标题】:How can a return JSON data for JQUERY datatable? 【发布时间】:2019-05-01 04:44:09 【问题描述】:如何生成 JSON 数据用于绑定 JQUERY 数据表?
我在 ASP.net Web 服务 (.asmx) 中使用以下代码
<WebMethod()> _
Public Function Getcdata() As String
Dim dt As New DataTable()
Using con As New SqlConnection(IDvar.Constr)
Using cmd As New SqlCommand("Select * from COMPLAINTTYPE", con)
con.Open()
Dim da As New SqlDataAdapter(cmd)
da.Fill(dt)
Dim serializer As New System.Web.Script.Serialization.javascriptSerializer()
Dim rows As New List(Of Dictionary(Of String, Object))()
Dim row As Dictionary(Of String, Object)
For Each dr As DataRow In dt.Rows
row = New Dictionary(Of String, Object)()
rows.Add(row)
Next
Context.Response.Write(serializer.Serialize(dt))
con.Close()
cmd.Dispose()
dt.Clear()
End Using
End Using
End Function
但这会返回错误。请检查我哪里错了
我在调用 web 方法时遇到的错误如下:
System.InvalidOperationException: A circular reference was detected while serializing an object of type 'System.Reflection.RuntimeModule'.
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValueInternal(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeValue(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat, MemberInfo currentMember)
at System.Web.Script.Serialization.JavaScriptSerializer.SerializeCustomObject(Object o, StringBuilder sb, Int32 depth, Hashtable objectsInUse, SerializationFormat serializationFormat)
【问题讨论】:
【参考方案1】:问题出现在这一行:
Context.Response.Write(serializer.Serialize(dt))
您正在尝试将DataTable
实例直接序列化为JavaScriptSerializer
实例,该实例接受IEnumerable
或Dictionary(Of TKey, TValue)
等集合对象。通常你需要的是使用AsEnumerable()
和[Select]()
LINQ方法转换成IEnumerable
:
Dim list = dt.AsEnumerable().[Select](Function(row) New With Key
.id = row("COMPLAINTID"), Key
.name = row("COMPLAINTNAME"),
' other DataTable columns here
).ToList()
Context.Response.Write(serializer.Serialize(list))
但是由于您有一个包含要序列化的对象的Dictionary(Of String, Object)
列表,因此只需将字典传递给序列化程序,而不是传递DataTable
:
Dim rows As New List(Of Dictionary(Of String, Object))()
Dim row As Dictionary(Of String, Object)
For Each dr As DataRow In dt.Rows
row = New Dictionary(Of String, Object)()
rows.Add(row)
Next
' pass the list of dictionary here
Context.Response.Write(serializer.Serialize(rows))
旁注:
您可以尝试 JSON.NET 中的JsonConvert.SerializeObject() 方法来序列化包含Dictionary(Of TKey, TValue)
对象的列表,它比JavaScriptSerializer.Serialize()
方法具有更好的字典处理能力。请注意,您应该检查输出以确保 JSON 字符串的格式正确。
【讨论】:
非常感谢您的回复。正如您所建议的,我尝试序列化行,但它返回一个空文档。我会尝试使用 JsonConvert 再次感谢!以上是关于如何为 JQUERY 数据表返回 JSON 数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 JSON Post 序列化 jQuery 对象数组?
在 VSCode 中,如何为没有 package.json 的项目启用 Angular/Backbone/jQuery 智能感知?
如何为 passportjs 使用 jquery/ajax 数据
如何为 Facebook 设置返回 JSON 的 XMPP 服务器?