【发布时间】: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 我是一名新员工,我还没有能力安装/引用新模块,所以我希望能利用我现有的资源来完成这项工作。