如何禁用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
相关产品推荐
相关产品推荐

