VB.NET中NewtonSoft.JSON序列化对象到客户端时遇未终止字符串错误
我之前处理过好几个类似的问题,这个错误基本上都是JSON格式生成不完整导致的,结合你的BankAccountPaymentProfile类,咱们从几个常见的排查方向入手:
先排查特殊字符未转义的问题
你的类里全是字符串属性,像AccountNumber、NameOnAccount这类字段,如果存了引号(")、反斜杠(\)或者换行符这类特殊字符,NewtonSoft.JSON默认的序列化规则可能没把它们转义好,直接导致JSON字符串中途被截断。试试给序列化加上强制转义的配置:Dim settings As New JsonSerializerSettings With { .StringEscapeHandling = StringEscapeHandling.EscapeNonAscii Or StringEscapeHandling.EscapeHtml } Dim json As String = JsonConvert.SerializeObject(yourPaymentProfile, settings)(注意你用的是VB.NET,所以代码用VB的写法更贴合你的场景)
检查是否存在循环引用
你提到类里有BillTo As New BillToProfile,如果BillToProfile这个子类里又反向引用了BankAccountPaymentProfile,或者和其他类形成了互相引用的关系,就会触发循环引用问题——序列化的时候会无限嵌套生成内容,最后导致JSON字符串永远没法闭合,自然就报"Unterminated String"了。解决办法很简单,要么忽略循环引用:Dim settings As New JsonSerializerSettings With { .ReferenceLoopHandling = ReferenceLoopHandling.Ignore } Dim json As String = JsonConvert.SerializeObject(yourPaymentProfile, settings)要么给循环引用的属性加上
<JsonIgnore>特性,不让它参与序列化。验证空值和无效字符
如果某个字符串属性是Nothing,或者包含了ASCII控制字符这类不可见的无效内容,也可能搞砸JSON结构。可以加上空值忽略的配置:Dim settings As New JsonSerializerSettings With { .NullValueHandling = NullValueHandling.Ignore }同时要确保所有字符串属性的值都是合法的,没有那种奇怪的不可见字符——比如从数据库或者第三方接口读过来的脏数据,很容易藏这种问题。
检查嵌套的
BillToProfile类
因为你的主类嵌套了BillToProfile,这个子类的序列化问题也会影响整体。比如子类里有没有特殊字符、循环引用,或者未初始化的属性?最好单独序列化一下BillToProfile对象,看看能不能生成合法的JSON,排除子类的问题。手动校验生成的JSON
你可以把服务器序列化后的JSON字符串输出到日志里,然后用JSON校验工具(本地随便找个在线的或者用VS的JSON编辑器)打开看看,一眼就能发现哪里有未闭合的引号、多余的逗号这类语法错误——如果某个字段的内容突然截断了,那十有八九是这个字段里的特殊字符没处理好。
一般按这个顺序排查,很快就能找到问题所在。
内容的提问来源于stack exchange,提问作者Prescott Chartier

