2010-11-12 49 views
2

好吧我一直在想這個,我讀了JavaScriptSerializer上的MSDN頁面。但是,我仍然無法弄清楚如何讓這個工作在asp.net頁面上。我想我的數據集轉換成JSON字符串,所以我可以用FLOT(繪圖工具)繪製它SQL數據集到JSON


這使得它的工作感謝您的幫助球員:這是在vb.net爲未來人

Imports System.Web.Script.Serialization 

....

Dim myObject = dataset.GetXml() 
Dim jsonString = (New JavaScriptSerializer()).Serialize(myObject) 
+1

我對VS 2005使用3.5 – MyHeadHurts 2010-11-12 15:39:36

回答

4

參考裝配System.Web.Extensions.dll,然後做到這一點。

+0

你知道該jsonString將成爲一個字符串。爲什麼不使用字符串而不是var?我喜歡C#中的var關鍵字,但它使一些人懶惰,一些代碼可讀性較差。請不要鼓勵這種不良做法。 – 2010-11-12 16:15:21

+5

我很抱歉,但我認爲這是非常錯誤的。即使不明確寫入類型,您也可以從類型系統中獲得所有好處。讓代碼可讀不是隨處可見的,而是爲事物賦予有意義的名稱(顯然,「jsonString」是一個完美的反例,但OP可以根據他的上下文選擇一個名稱)。你有沒有每個人都使用一種語言,其中一切(甚至函數參數和返回值)是隱含的?你有沒有使用動態語言?當他們鼓勵不好的練習時,我們如何使用這樣的語言? – Jakob 2010-11-12 16:42:49

+0

序列化「System.Globalization.CultureInfo」類型的對象時檢測到循環引用。 – MyHeadHurts 2010-11-12 16:44:07

2

我在使用PlotKit處理項目時做了以下操作。我創建了一個Web服務返回的數據,並設置響應格式傑森......這是前一陣子......也應該在3.5

在這裏工作是一個示例

<WebMethod()> _ 
    <Script.Services.ScriptMethod(UseHttpGet:=True, ResponseFormat:=ResponseFormat.Json)> _ 
     Public Function GetSales(ByVal a As String) As Generic.List(Of Sale) 
     Dim _conn As SqlConnection = New SqlConnection(connstr) 
     Dim _dr As SqlDataReader 
     Try 
      Dim _cmd As SqlCommand = New SqlCommand("select * from sales", _conn) 
      _conn.Open() 
      _dr = _cmd.ExecuteReader(CommandBehavior.CloseConnection) 

      If _dr.HasRows Then 
       Dim s As Sale 
       Dim c As New Generic.List(Of Sale) 
       While _dr.Read 
        s = New Sale 
        With s 
         .Month = _dr("monthname") 
         .TheSale = _dr("sale") 
        End With 
        c.Add(s) 
       End While 

       Return c 
      End If 

     Catch ex As Exception 
      MsgBox(ex.Message) 
     Finally 
      _conn.Close() 
     End Try 

       End Function 

End Class 

這裏是對象類...通知我正在序列化對象。更多信息

using System.Web.Script.Serialization; 

.... 

var myObject = ... your stuff ... 
var jsonString = new JavaScriptSerializer().Serialize(myObject); 

退房的MSDN page

<Serializable()> _ 
Public Class Sale 
    Private _month As String 
    Private _sale As String 

    Public Property Month() As String 
     Get 
      Return _month 
     End Get 
     Set(ByVal value As String) 
      _month = value 
     End Set 
    End Property 

    Public Property TheSale() As String 
     Get 
      Return _sale 
     End Get 
     Set(ByVal value As String) 
      _sale = value 
     End Set 
    End Property 
End Class 
1
public static string DStoJSON(DataSet ds) 
{ 
    StringBuilder json = new StringBuilder(); 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     json.Append("{"); 

     int i = 0; 
     int colcount = dr.Table.Columns.Count; 

     foreach (DataColumn dc in dr.Table.Columns) 
     { 
      json.Append("\""); 
      json.Append(dc.ColumnName); 
      json.Append("\":\""); 
      json.Append(dr[dc]); 
      json.Append("\""); 

      i++; 
      if (i < colcount) json.Append(","); 

     } 
     json.Append("\"}"); 
     json.Append(","); 
    } 
    return json.ToString(); 
} 

可能對您最有用的是數據集循環而不是stringbuilder。您可以將這些循環放入一個對象中,然後使用javascript serializer庫。

甚至更​​好,如果你正在使用asp.net的MVC,你可以這樣做:

return Json(List<myobject>, JsonRequestBehavior.AllowGet); 

但這種方式是快速&容易! - 我沒有完全測試這個!附加的逗號可能是錯誤的(或代碼可以提高)和最後一行逗號需要處理

我使用MVC方式&永不回頭:)

+0

你能幫我把它轉換成vb.net,或者不可能 – MyHeadHurts 2010-11-12 17:07:59

+0

你爲什麼要在.NET中有一個實現你自己的序列化程序? – Artemiy 2010-11-12 17:14:38

+0

我基本上這麼說! - 這只是如果他不想使用一個對象! – 2010-11-12 17:22:11