You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置JsonSerializerOptions使字符串中的+不被编码?

解决JSON序列化时保留电话号码中+字符的问题

当你需要序列化带国际区号的电话号码(比如+1234567890)时,默认的JSON编码器会把+转义为\u002B,导致第三方API无法识别正确的号码格式。下面是两种可行方案的对比和推荐实现:

优先选择:精细控制的自定义编码器

使用JavaScriptEncoder.Create()可以精准指定允许不编码的字符,只放行+号,同时保留其他默认的安全转义规则,这是最稳妥的方案。

代码实现

using System.Text.Encodings.Web;
using System.Text.Json;

// 创建仅允许+号不被编码的自定义编码器
var customPhoneEncoder = JavaScriptEncoder.Create(UnicodeRanges.All, additionalAllowedCharacters: new[] { '+' });

// 配置JSON序列化选项
var jsonOptions = new JsonSerializerOptions
{
    Encoder = customPhoneEncoder,
    // 根据需求添加其他配置,比如WriteIndented = true
};

// 序列化示例
var phoneData = new { InternationalPhone = "+8613800138000" };
var serializedJson = JsonSerializer.Serialize(phoneData, jsonOptions);
// 输出结果:{"InternationalPhone":"+8613800138000"}

这个方案的优势在于:只针对+号取消转义,其他需要转义的字符(如双引号、控制字符)依然会被正确处理,既满足了第三方API的格式要求,又保证了JSON的规范性和安全性。

不推荐:使用UnsafeRelaxedJsonEscaping

UnsafeRelaxedJsonEscaping会禁用大量字符的转义,包括<、>、&、'等,虽然能保留+号,但会带来两个问题:

  • 生成的JSON可能不符合标准RFC规范,第三方API可能无法正常解析;
  • 如果输入的电话号码包含特殊字符(比如用户恶意输入的<script>),会直接输出到JSON中,存在安全注入风险。

除非你完全信任所有输入内容,且第三方API明确要求使用这种非标准的JSON格式,否则不要使用这个编码器。

内容的提问来源于stack exchange,提问作者imsan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:10:34