【问题标题】:VB.Net SQL results to JSON for AjaxVB.Net SQL 结果为 Ajax 的 JSON
【发布时间】:2014-06-24 18:00:15
【问题描述】:

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

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

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

但是当我把它传回去时,它最终会变成:

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

我知道(现在)它正在尝试序列化返回值,所以我尝试使用数据表并对其进行序列化,然后使用 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 数据库中提取图表数据。

【问题讨论】:

  • 为什么不用json.net?
  • @Daniel 我是一名新员工,我还没有能力安装/引用新模块,所以我希望能利用我现有的资源来完成这项工作。

标签: asp.net json vb.net


【解决方案1】:

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

在我正在使用的 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] 在我的 gridview 中设置 html 文本值。

所以对于你的问题,它看起来像:

success: function (r) {
                var data = r.d[0]; 
                var data2 = r.d[1]; }

Here's an explanation that I found covering the .d

【讨论】:

    【解决方案2】:

    在数据表中获取您的 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;
    

    【讨论】:

    • 我填充了一个数据表,添加了列名并调用了您的 GetJson 函数 Dim sData As String = GetJson(dt) Return sData
    • 评论时间不够我填充了一个数据表,添加了列名并调用了您的 GetJson 函数 Dim sData As String = GetJson(dt) Return sData 但是如果我添加警报(数据)到 aspx 页面,我得到 [{"Name":"PROAIR","Value":7},{"Name":"NASONEX","Value":4}] 在列周围加上引号,我没有任何图表。我需要从列名中删除 "。
    • 使用 jQuery.parseJSON(r.d)
    • 在 aspx 页面中我有 var data = r.d; var d2 = jQuery.parseJSON(data) alert(JSON.stringify(d2));警报(d2); stringify 在引号中显示对的名称,警报仅显示 [object][object]。为了让 D3 准备好数据集,我只需要删除返回集中“值”一词周围的引号,它“应该”工作(我认为)。
    • 所以实际上,我可以从“value”中删除引号,或者在整数中添加引号。我将 SQL 查询更改为将计数转换为 varchar,并且数据表以 D3 应该可读的格式序列化。 (不是,但这是一个不同的问题)。当我可以投票或标记为答案时,我会的。感谢您的帮助。
    【解决方案3】:

    虽然这不能直接回答问题,但希望能对某人有所帮助。以下是我使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多