asp.net - VB.Net SQL 结果为 Ajax 的 JSON

标签 asp.net json vb.net

新程序员,我正在使用 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 数据库中提取图表数据。

最佳答案

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

关于asp.net - VB.Net SQL 结果为 Ajax 的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23523217/

相关文章:

asp.net - 将所有 URL 替换为超链接

c# - asp.net(C#)提交两三个表单后如何获取First flash文件数据?

javascript - 服务器端的 AngularJS 变量

c# - IIS 8.0 HTTP 错误 404.17 - 未找到请求的内容似乎是脚本,不会由静态文件处理程序提供服务

android - 反序列化时出现 Gson 异常(无参数构造函数不存在)

c# - 我真的不应该在属性访问器中做 "long running"事情吗?

c# - 混淆旨在返回图像的 HTTP 处理程序

带有 MultipartFile 的 Java jackson

json - Rust 和 JSON 序列化

vb.net - 有 VB 6 到 VB.net 转换指南吗?