如何使用Newtonsoft序列化含反斜杠的VB.NET对象
问题解决:Newtonsoft.Json 序列化时保留单个反斜杠的 Unicode 转义序列
你的核心问题是:字符串中存储的是字面量的 \uD83D\uDE00(即包含\、u、D等普通字符),但 Newtonsoft.Json 默认会将字符串中的\转义为\\,导致输出不符合预期。以下是两种基于 Newtonsoft 原生能力的解决方法:
方案1:将字面量转义序列转为实际 Unicode 字符
如果你的最终目标是让 JSON 解析后得到 Emoji 表情,而非保留\uXXXX文本格式,可以先把字面量转义序列转换为实际的 Unicode 字符,再进行序列化:
' 将字面量的\u序列转为实际Emoji字符 Dim emojiText As String = Newtonsoft.Json.JsonConvert.DeserializeObject(Of String)("""\uD83D\uDE00""") Dim msgObject As New Message With {.Emoji = emojiText} ' 序列化时配置转义非ASCII字符,即可输出\u格式的序列 Dim settings As New JsonSerializerSettings With { .StringEscapeHandling = StringEscapeHandling.EscapeNonAscii } Dim msgJson As String = Newtonsoft.Json.JsonConvert.SerializeObject(msgObject, settings)
输出结果:
{"Emoji":"\uD83D\uDE00"}
方案2:自定义 JsonConverter 强制保留原始转义序列
如果必须直接输出字面量的\uXXXX作为 JSON 转义序列(不转换为实际字符),可以自定义转换器跳过 Newtonsoft 的自动转义逻辑:
Public Class RawUnicodeSequenceConverter Inherits JsonConverter(Of String) Public Overrides Sub WriteJson(writer As JsonWriter, value As String, serializer As JsonSerializer) If value Is Nothing Then writer.WriteNull() Return End If ' 直接写入原始字符串,关闭自动转义 writer.WriteRawValue("""" & value & """") End Overrides Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As String, hasExistingValue As Boolean, serializer As JsonSerializer) As String Return reader.Value?.ToString() End Function End Class
使用方式:
Dim msgObject As New Message With {.Emoji = "\uD83D\uDE00"} Dim settings As New JsonSerializerSettings() settings.Converters.Add(New RawUnicodeSequenceConverter()) Dim msgJson As String = Newtonsoft.Json.JsonConvert.SerializeObject(msgObject, settings)
输出结果:
{"Emoji":"\uD83D\uDE00"}
注意:方案2需要确保输入字符串是合法的 JSON 转义序列,否则可能导致 JSON 格式错误。
内容的提问来源于stack exchange,提问作者AAP
相关产品推荐
相关产品推荐

