VB.Net将SQL查询结果转换为Ajax可用的JSON格式

4

作为一名新手程序员,我正在使用VB.Net代码构建一个aspx页面,并尝试使用来自我们数据库的数据创建D3图表,但是我无法将返回值转换成正确的格式。

在我的VB代码中,我可以将字符串转换为我想要的确切格式:

[{ name: "PROAIR", value: 7}],{ name: "NASONEX", value: 4}] 

但是当我传回它时,最终结果变成了:
{"d":"[{name: \"PROAIR\", value: 7},{name: \"NASONEX\", value: 4}]"}

我现在知道它尝试对返回值进行序列化,所以我尝试使用datatable并对其进行序列化,然后尝试使用List (Of Object)进行序列化,但每次都会得到不同的结果,并且返回值中有更多的引号和反斜杠。 我查看了Microsoft Person示例和一些Stack Contacts示例,但我真的需要构建一个全新的类并向其中添加新项吗?

我的字符串生成器代码如下:
Dim sData As String
Dim sqlCmd As New SqlCommand(strSql, cn)
Using sdr As SqlDataReader = sqlCmd.ExecuteReader()
  Dim sb As New StringBuilder()
  sb.Append("[")
  While sdr.Read()
    sb.Append("{")
    System.Threading.Thread.Sleep(50)
    sb.Append(String.Format("name: '{0}', value: {1}", sdr(0), sdr(1)))
    sb.Append("},")
  End While
  sb = sb.Remove(sb.Length - 1, 1)
  sb.Append("]")
  sData = sb.ToString
  sData = sData.Replace("'", ControlChars.Quote)
  cn.Close()

  Return sData
End Using

如果我尝试对该字符串进行序列化:
Dim serializer As New JavaScriptSerializer()
Dim SerializedResult = serializer.Serialize(sData)
Return SerializedResult 

我得到的结果是:{"d":"\"[{name: \\\"PROAIR\\\", value: 7},{name: \\\"NASONEX\\\", value: 4}]\""} 我尝试使用以下代码进行反序列化: Dim deserializedResult = serializer.Deserialize(Of String)(sData) 但是它报错了,显示数组类型失败,所以显然你不能这样做 :)
在aspx页面中,我已经硬编码了:
success: function (r) {
var data = [{ name: "PROAIR", value: 7}],{ name: "NASONEX", value: 4}]

我的图表构建得非常完美,所以只需要以正确的格式返回SQL数据并更改脚本代码为var data = r;

编辑 下面是可工作的代码:

aspx页面:

    $(function () {
        GetData();
    });

    function GetData() {
        $.ajax({
            type: "post",
            url: "D3PieChart.aspx/GetData",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (r) {

                data = r.d;
                data = jQuery.parseJSON(data)

-- Build D3 chart commands in this section --

            },
            error: function (xhr, status, error) {
                OnFailure(error);
                alert('Error');
            }
        });
   }

</script>

VB页面:

<WebMethod()> _
Public Shared Function GetData() As String     

    Dim sConnect As String = ConfigurationManager.ConnectionStrings("SQLConnectionString").ConnectionString
    Dim cn As New SqlConnection(sConnect)
Dim strSql As String = "SELECT name and a count of stuff "
strSql += "FROM a bunch of tables WHERE stuff = stuff "

    Dim dtb As New DataTable
    cn.Open()
    If (cn.State And ConnectionState.Open) <> 0 Then
        Dim sqlCmd As New SqlCommand(strSql, cn)
        Dim sqlDad As New SqlDataAdapter(sqlCmd)
        sqlDad.Fill(dtb)
        dtb.Columns(0).ColumnName = "Name"
        dtb.Columns(1).ColumnName = "value"
        Dim sjData As String = GetJson(dtb)
        Return sjData
    End If
    Return -1
End Function



Public Shared Function GetJson(ByVal dt As DataTable) As String
    Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer()
    serializer.MaxJsonLength = Integer.MaxValue

    Dim rows As New List(Of Dictionary(Of String, Object))()
    Dim row As Dictionary(Of String, Object) = Nothing
    Dim row2 As Dictionary(Of Integer, Object) = Nothing
    For Each dr As DataRow In dt.Rows
        row = New Dictionary(Of String, Object)()
        row2 = New Dictionary(Of Integer, Object)()
        For Each dc As DataColumn In dt.Columns
            row.Add(dc.ColumnName.Trim(), dr(dc))
        Next
        rows.Add(row)
    Next
    Return serializer.Serialize(rows)
End Function
End Class

这是一个简单的图表,没有任何参数,所有内容都是硬编码的,但它从SQL Server数据库中获取图表数据。


1
为什么不使用Json.Net呢? - Daniel A. White
@Daniel 我是一名新员工,还没有安装/引用新模块的能力,所以我希望能够利用现有的资源来完成这个任务。 - Dave
3个回答

4

将您的Sql结果放入数据表中,然后将其简单地传递给GetJson方法以获取JSON字符串。

Dim da As New OleDb.OleDbDataAdapter(strSql, cn)
Dim dt As DataTable = New DataTable
da.Fill(dt)

Dim sData As string = GetJson(dt)



 Public Shared Function GetJson(ByVal dt As DataTable) As String
        Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer()
        serializer.MaxJsonLength = Integer.MaxValue

        Dim rows As New List(Of Dictionary(Of String, Object))()
        Dim row As Dictionary(Of String, Object) = Nothing
        For Each dr As DataRow In dt.Rows
            row = New Dictionary(Of String, Object)()
            For Each dc As DataColumn In dt.Columns

                row.Add(dc.ColumnName.Trim(), dr(dc))

            Next
            rows.Add(row)
        Next
        Return serializer.Serialize(rows)
    End Function

添加System.Collections.Generic的引用。

在aspx页面上。

success: function (r) {
var data = r.d;

我填充了一个datatable,添加了列名并调用了您的GetJson函数。Dim sData As String = GetJson(dt)。返回sData。 - Dave
我在注释上耗费了太多时间。我填充了一个datatable,添加了列名并调用了您的GetJson函数。Dim sData As String = GetJson(dt) Return sData 但是,如果我在aspx页面中添加一个alert(data),我会得到[{"Name":"PROAIR","Value":7},{"Name":"NASONEX","Value":4}],其中列名周围有引号,我没有得到任何图表。我需要去掉列名上的引号。 - Dave
使用jQuery.parseJSON(r.d) - Anubrij Chandra
实际上,我可以从"value"中删除引号,或者给整数添加引号。我将我的SQL查询更改为将计数转换为varchar,并且数据表以应该可读取D3的格式进行序列化。(它不是,但这是另一个问题)。当我可以投票或标记为答案时,我会的。感谢您的帮助。 - Dave
一旦我将SQL中的int转换为varchar,我回去添加了jQuery.parseJSON(r.d),现在它可以工作了。我会更新问题并附上可用的代码。再次感谢您的帮助。 - Dave
显示剩余2条评论

0

虽然这并没有直接回答问题,但希望能对某些人有所帮助。以下是我使用的代码,通过SP从数据库获取结果,并以json格式返回:

Ajax代码:

var url = 'Default.aspx/GetDetails';
$.ajax({
         type: 'POST',
         url: url,
         data: JSON.stringify({ 'name': YourValfromHtmlElement }),
         contentType: "application/json; charset=utf-8",
         dataType: "json",
         success: function (response) {
            var myObj = JSON.parse(response.d);
            email = myObj.eMail;
            extension = myObj.Extension;
            //rest of code
         }
});

Default.aspx.vb 代码:

<WebMethod()>
Public Shared Function GetDetails(ByVal name As String)
    'open sql connection
    Dim dbConn As SqlConnection = New SqlConnection(connString)
    dbConn.Open()
    'create and excute sql command
    Dim dbComm As SqlCommand = New SqlCommand()
    dbComm.Connection = dbConn
    dbComm.CommandType = CommandType.StoredProcedure
    dbComm.CommandText = "Your_SP"
    dbComm.Parameters.AddWithValue("SearchParam", name)
    'open sql reader
    Dim dbRead As SqlDataReader = dbComm.ExecuteReader
    Dim jse As Script.Serialization.JavaScriptSerializer = New 
    Script.Serialization.JavaScriptSerializer
    Dim jsonoutput As String = String.Empty
    While dbRead.Read
        jsonoutput = JsonConvert.SerializeObject(New With {.eMail = 
        dbRead("eMail"), .Extension = dbRead("Extension")})
    End While
    Return jsonoutput
End Function

0

我在我的项目中做了类似的事情,希望能对你有所帮助:

在我的aspx页面中,我使用 -

$.ajax({
            ...
            error: function () {

            },
            success: function (result) {
                $("#MainContent_EmployeesGridView").find('span[id="MainContent_EmployeesGridView_minIncrease_' + rowNum + '"]').html(result.d[0]);
                $("#MainContent_EmployeesGridView").find('span[id="MainContent_EmployeesGridView_maxIncrease_' + rowNum + '"]').html(result.d[1]);
            }
        });

需要注意的重要部分是我使用result.d[0]来设置网格视图中HTML文本的值。
因此,对于您的问题,它看起来应该是这样的:
success: function (r) {
                var data = r.d[0]; 
                var data2 = r.d[1]; }

这是我找到的一个关于 .d 的解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接