VB.NET 中 JSON 数据的转义处理:从基础到实践**
在 VB.NET 开发中,处理 JSON 数据已成为一项常见任务,无论是调用 Web API、读取配置文件,还是进行数据序列化与反序列化,我们都不可避免地要与 JSON 格式打交道,JSON 格式有其严格的语法规则,其中对某些特殊字符需要进行“转义”(Escaping)处理,以确保 JSON 字符串的正确性和解析器的兼容性,本文将探讨在 VB.NET 中如何处理 JSON 数据的转义问题,包括内置机制、手动处理以及常见场景下的最佳实践。
为什么 JSON 需要转义?
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它的语法基于 JavaScript 的一个子集,但独立于语言和平台,在 JSON 中,字符串必须用双引号()括起来,如果字符串内容本身包含双引号、反斜杠(\)、控制字符(如换行符 \n、回车符 \r、制表符 \t)等,就必须使用反斜杠进行转义,以避免破坏 JSON 的结构或引起解析错误。
字符串 He said, "Hello World!" 在 JSON 中必须表示为 "He said, \"Hello World!\""。
VB.NET 中 JSON 序列化与转义
VB.NET 中处理 JSON 最常用的方式是使用序列化(Serialization)将对象转换为 JSON 字符串,以及反序列化(Deserialization)将 JSON 字符串转换回对象,主流的 JSON 库(如 Newtonsoft.Json,也称为 Json.NET)和 .NET 内置的 System.Text.Json 都会自动处理这些转义字符。
使用 Newtonsoft.Json (Json.NET)
Json.NET 是 .生态中最流行的 JSON 库之一,它提供了强大的序列化和反序列化功能,并且会自动对特殊字符进行转义。
示例代码:
Imports Newtonsoft.Json
Public Class Person
Public Property Name As String
Public Property Message As String
Public Property Bio As String
End Class
Module Module1
Sub Main()
Dim person As New Person With {
.Name = "John ""Johnny"" Doe",
.Message = "This is a test line.\nAnd this is another line.",
.Bio = "C:\Path\To\Bio.txt"
}
' 序列化对象为 JSON 字符串,Json.NET 会自动处理转义
Dim json As String = JsonConvert.SerializeObject(person, Formatting.Indented)
Console.WriteLine("序列化后的 JSON:")
Console.WriteLine(json)
' 输出结果类似:
' {
' "Name": "John ""Johnny"" Doe",
' "Message": "This is a test line.\nAnd this is another line.",
' "Bio": "C:\\Path\\To\\Bio.txt"
' }
' 反序列化 JSON 字符串回对象
Dim deserializedPerson As Person = JsonConvert.DeserializeObject(Of Person)(json)
Console.WriteLine(vbCrLf & "反序列化后的对象:")
Console.WriteLine($"Name: {deserializedPerson.Name}")
Console.WriteLine($"Message: {deserializedPerson.Message}")
Console.WriteLine($"Bio: {deserializedPerson.Bio}")
End Sub
End Module
在上面的例子中,Json.NET 自动将:
- 转义为
\" \n保留(因为它是 JSON 中的有效转义字符,表示换行)\转义为\\
使用 .NET 内置的 System.Text.Json
从 .NET Core 3.0 和 .NET 5/6/7/8 开始,System.Text.Json 成为官方推荐的 JSON 处理库,它同样会自动处理转义字符。
示例代码:
Imports System.Text.Json
Imports System.Text.Json.Serialization
Public Class Person
Public Property Name As String
Public Property Message As String
Public Property Bio As String
End Class
Module Module1
Sub Main()
Dim person As New Person With {
.Name = "John ""Johnny"" Doe",
.Message = "This is a test line.\nAnd this is another line.",
.Bio = "C:\Path\To\Bio.txt"
}
' 序列化对象为 JSON 字符串,System.Text.Json 会自动处理转义
Dim options As New JsonSerializerOptions With {
.WriteIndented = True
}
Dim json As String = JsonSerializer.Serialize(person, options)
Console.WriteLine("序列化后的 JSON:")
Console.WriteLine(json)
' 输出结果类似:
' {
' "Name": "John ""Johnny"" Doe",
' "Message": "This is a test line.\nAnd this is another line.",
' "Bio": "C:\\Path\\To\\Bio.txt"
' }
' 反序列化 JSON 字符串回对象
Dim deserializedPerson As Person = JsonSerializer.Deserialize(Of Person)(json)
Console.WriteLine(vbCrLf & "反序列化后的对象:")
Console.WriteLine($"Name: {deserializedPerson.Name}")
Console.WriteLine($"Message: {deserializedPerson.Message}")
Console.WriteLine($"Bio: {deserializedPerson.Bio}")
End Sub
End Module
System.Text.Json 的默认行为也会正确转义 JSON 特殊字符。
手动处理 JSON 转义(不推荐,除非必要)
在大多数情况下,依赖成熟的 JSON 库来自动处理转义是最佳选择,手动处理转义容易出错,尤其是在处理复杂字符串时,但在某些特定场景下,例如你需要构建一个非常简单的 JSON 片段,或者需要控制转义行为(比如避免对某些字符转义),你可能需要手动进行转义。
VB.NET 本身没有内置一个通用的 JSON 转义方法,但你可以使用 System.Text.Json.JsonEncodedText 或者自己实现简单的转义逻辑。
使用 System.Text.Json.JsonEncodedText 进行手动编码
Imports System.Text.Json
Module Module1
Sub Main()
Dim originalText As String = "He said, ""Hello"" and \n escaped."
' 手动创建 JsonEncodedText,这会自动处理转义
Dim encodedText As JsonEncodedText = JsonEncodedText.Encode(originalText)
Dim json As String = $"{{""message"": {encodedText}}}"
Console.WriteLine(json)
' 输出: {"message": "He said, \"Hello\" and \n escaped."}
End Sub
End Module
自定义简单转义函数(仅作示例,不推荐用于生产)
如果你确实需要手动转义,可以编写一个辅助函数:
Imports System.Text
Module Module1
Function EscapeJsonString(input As String) As String
If String.IsNullOrEmpty(input) Then
Return """"
End If
Dim sb As New StringBuilder()
sb.Append("""")
For Each c As Char In input
Select Case c
Case """"
sb.Append("\""")
Case "\"
sb.Append("\\")
Case ControlChars.Cr
sb.Append("\r")
Case ControlChars.Lf
sb.Append("\n")
Case ControlChars.Tab
sb.Append("\t")
Case ControlChars.Backspace
sb.Append("\b")
Case ControlChars.FormFeed
sb.Append("\f")
Case ""
sb.Append("\u0000") ' 控制字符,可根据需要扩展
Case Else
If Char.GetUnicodeCategory(c) = Globalization.UnicodeCategory.Control Then
' 其他控制字符,转换为 \uXXXX 格式
sb.Append(String.Format("\u{0:X4}", AscW(c)))
Else
sb.Append(c)
End If
End Select
Next
sb.Append("""")
Return sb.ToString()
End Function
Sub Main()
Dim testString As String = "This is a ""test"" string.\nWith newlines and \t tabs."
Dim escapedString As String = EscapeJsonString(testString)
Console.WriteLine(escapedString)
' 输出: "This is a \"test\" string.\nWith newlines and \t tabs."
Dim simpleJson As String = $"{{""data"": {escapedString}}}"
Console.WriteLine(simpleJson)
' 输出: {"data": "This is a \"test\" string.\nWith newlines and \t tabs."}
End Sub
End Module
注意: 自定义转义函数容易遗漏某些边缘情况或 Unicode 字符,因此在实际开发中,强烈建议优先使用成熟的 JSON 库。
控制转义行为(高级)
有时,你可能不希望对某些字符进行转义,或者希望控制缩进、日期格式等,主流 JSON 库都提供了配置选项。
Newtonsoft.Json 示例:
Dim settings As New JsonSerializerSettings()
settings.Formatting = Formatting.Indented ' 美化输出
settings.ContractResolver = New CamelCasePropertyNamesContractResolver() ' 属性名驼峰命名
' 禁止对特定字符转义(通常不推荐,除非


还没有评论,来说两句吧...