JSON, XML and Serialization

35.1 JSON with System.Text.Json

Newtonsoft.Json (JsonConvert.SerializeObject / DeserializeObject) is still widely used in older VB projects.

Imports System.Text.Json
Imports System.Text.Json.Serialization

Public Class Person
    Public Property Name As String
    Public Property Age As Integer
    <JsonPropertyName("email_address")>
    Public Property Email As String
    <JsonIgnore>
    Public Property Password As String
    Public Property Tags As List(Of String)
End Class

Dim p As New Person With {.Name = "Ana", .Age = 30, .Email = "ana@x.com", .Tags = New List(Of String) From {"admin"}}
Dim options As New JsonSerializerOptions With {.WriteIndented = True, .PropertyNamingPolicy = JsonNamingPolicy.CamelCase}
Dim json = JsonSerializer.Serialize(p, options)
Console.WriteLine(json)

Dim back = JsonSerializer.Deserialize(Of Person)(json, options)
Dim people = JsonSerializer.Deserialize(Of List(Of Person))(File.ReadAllText("people.json"))

' Dynamic access with JsonDocument / JsonNode
Using doc = JsonDocument.Parse("{""name"":""Bo"",""scores"":[90,85]}")
    Console.WriteLine(doc.RootElement.GetProperty("name").GetString())
End Using
Dim node = Nodes.JsonNode.Parse("{""a"":{""b"":5}}")
Console.WriteLine(node("a")("b").GetValue(Of Integer)())

35.2 XML

' LINQ to XML (or XML literals: Module 28)
Dim doc = XDocument.Load("books.xml")
Dim titles = From b In doc.Descendants("book")
             Where CInt(b.Attribute("year")) > 2010
             Select b.Element("title").Value

' XmlSerializer
Imports System.Xml.Serialization
Dim serializer As New XmlSerializer(GetType(Person))
Using writer As New StreamWriter("person.xml")
    serializer.Serialize(writer, p)
End Using
Using reader As New StreamReader("person.xml")
    Dim loaded = DirectCast(serializer.Deserialize(reader), Person)
End Using
' Also: XmlDocument (DOM), XmlReader/XmlWriter (streaming), XSLT (XslCompiledTransform)

35.3 CSV and Other Formats

CSV: TextFieldParser (Module 33) or CsvHelper (NuGet). Excel files: ClosedXML, EPPlus, NPOI (no Office installation needed). YAML: YamlDotNet.

BinaryFormatter is obsolete and insecure. Never use it for new code.