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

如何禁用Newtonsoft.Json对单引号非标准JSON的解析支持?

如何让Newtonsoft.Json仅解析标准双引号JSON(和PHP规则对齐)

当然可以实现!Newtonsoft.Json默认确实兼容单引号包裹的非标准JSON,但我们可以通过配置严格限制它只遵循标准JSON规范,和PHP的解析行为完全一致。

核心解决方案:禁用AllowSingleQuotes选项

Newtonsoft.Json的解析器有一个AllowSingleQuotes开关,默认值为true(允许单引号),我们只需要把它设为false,就能拒绝所有单引号格式的JSON。

方法1:使用JsonConvert.DeserializeObject时传入自定义设置

这是最常用的场景,直接在反序列化时指定配置:

using Newtonsoft.Json;

// 定义你的数据模型
public class YourModel
{
    public string Key { get; set; }
}

// 配置严格的JSON解析规则
var strictSettings = new JsonSerializerSettings
{
    ReaderSettings = new JsonReaderSettings
    {
        AllowSingleQuotes = false // 禁用单引号支持
    }
};

// 测试非标准单引号JSON(会抛出异常)
try
{
    var invalidJson = "{'key':'value'}";
    var result = JsonConvert.DeserializeObject<YourModel>(invalidJson, strictSettings);
}
catch (JsonReaderException ex)
{
    // 这里会捕获解析错误,和PHP的行为一致
    Console.WriteLine($"解析失败:{ex.Message}");
}

// 测试标准双引号JSON(正常解析)
var validJson = "{\"key\":\"value\"}";
var validResult = JsonConvert.DeserializeObject<YourModel>(validJson, strictSettings);
Console.WriteLine($"解析成功:Key = {validResult.Key}");

方法2:直接配置JsonTextReader

如果你是手动使用JsonTextReader读取流或字符串,也可以直接设置该属性:

using System.IO;
using Newtonsoft.Json;

var invalidJson = "{'key':'value'}";
using (var stringReader = new StringReader(invalidJson))
using (var jsonReader = new JsonTextReader(stringReader))
{
    jsonReader.AllowSingleQuotes = false; // 禁用单引号支持
    var serializer = JsonSerializer.CreateDefault();
    
    try
    {
        var result = serializer.Deserialize<YourModel>(jsonReader);
    }
    catch (JsonReaderException ex)
    {
        Console.WriteLine($"解析失败:{ex.Message}");
    }
}

效果说明

设置AllowSingleQuotes = false后,任何包含单引号的非标准JSON都会触发JsonReaderException,这和PHP解析时拒绝单引号JSON的行为完全一致,确保只有符合RFC 8259标准的双引号JSON才能被正确解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:50