I searched high and wide for something simple to do this and every function I found basically reinvented the wheel from scratch. If you do any amount of searching, you can find the
JavaScriptSerializer
object which will convert objects to JSON. Sounds easy enough...WRONG! Even converting an empty
DataSet
will return a circular reference exception.
On a similar note, I found several articles claiming to convert XML to JSON using the same function. The "solution" was something like this:
Dim jss As New JavaScriptSerializer
Dim jsonString As String = jss.Serialize(DataSet1.GetXML())
I tried this thinking it made sense. But instead of serializing the data in the XML, it simply dumps the entire XML
string
into a single element in the JSON
string
. I'm pretty sure that's not what anyone wants it to do.
So how do you do it? Well, there are a number of methods, but I found the quickest and easiest is to just convert your
DataSet
to a
Dictionary
object, then use the
JavaScriptSerializer
to make the conversion.
Here's the code:
Function DataSetToJSON(ds As DataSet) As String
Dim dict As New Dictionary(Of String, Object)
For Each dt As DataTable In ds.Tables
Dim arr(dt.Rows.Count) As Object
For i As Integer = 0 To dt.Rows.Count - 1
arr(i) = dt.Rows(i).ItemArray
Next
dict.Add(dt.TableName, arr)
Next
Dim json As New JavaScriptSerializer
Return json.Serialize(dict)
End Function
If you're looking to convert XML to JSON and write the least amount of code, you can just write it to a
DataSet
on the fly like this:
DataSetToJSON(New DataSet().ReadXml(xmlString))
I know it sounds crazy, but both of these methods are really simple and execute really fast. And you don't need to know about XLT or anything else. Oh, and the only libraries you need are
System.Data
and
System.Web.Script.Serialization
.
When it comes around to referencing the JSON object from your browser, you can access the elements like so:
jsonString.TableName[rowIndex][columnIndex]
If anyone knows how to make the conversion, you can reference it by
jsonString.TableName.Column[rowIndex]
, I would love to see it.