如何让Newtonsoft.Json读取JSON路径值时不转换或篡改值?
解决JSON读取时保留原始字符串值的问题
针对你遇到的Newtonsoft.Json自动转换ISO 8601日期格式的问题,这里有几个可靠的解决方案,同时也会提供非Newtonsoft库的替代方案:
使用Newtonsoft.Json的解决方案
方案1:直接获取JValue的原始字符串
当你用SelectToken拿到的是JValue类型时,它的OriginalString属性会直接返回JSON文档中的原始字面量,不会做任何格式转换。你可以这样写:
JToken token = jsonObject.SelectToken("path.to.nested.value"); string originalValue = token is JValue jValue ? jValue.OriginalString : token.ToString();
这个方法的好处是不需要修改全局序列化配置,针对单个Token处理,既保留了原始值,又能兼容其他类型的Token(比如数组、对象)。
方案2:禁用日期自动解析
如果你希望整个JSON解析过程中都把日期当作字符串处理,不自动转换为DateTime类型,可以配置JsonSerializerSettings:
var settings = new JsonSerializerSettings { DateParseHandling = DateParseHandling.None }; JObject jsonObject = JsonConvert.DeserializeObject<JObject>(yourJsonString, settings); string originalValue = jsonObject.SelectToken("path.to.nested.value").ToString();
这样所有的日期字符串都会被解析为JString类型,调用ToString()就会直接返回原始的ISO 8601格式。
非Newtonsoft的替代方案:System.Text.Json
如果你愿意切换到.NET内置的System.Text.Json(推荐.NET Core/.NET 5+使用),默认情况下它不会自动把ISO日期字符串解析为DateTime类型,直接获取字符串就能得到原始值:
使用JsonDocument(高性能、只读)
using JsonDocument doc = JsonDocument.Parse(yourJsonString); JsonElement element = doc.RootElement .GetProperty("path") .GetProperty("to") .GetProperty("nested") .GetProperty("value"); string originalValue = element.GetString();
使用JsonNode(.NET 6+,可读写)
JsonNode jsonNode = JsonNode.Parse(yourJsonString); string originalValue = jsonNode["path"]["to"]["nested"]["value"].GetValue<string>();
核心思路总结
不管用哪个库,关键都是避免让JSON解析器把原始字符串转换为强类型(比如DateTime)后再转回字符串,而是直接提取JSON文档中的原始字面量表示。这样就能保证所有值都以原样传输,不会被篡改格式。
内容的提问来源于stack exchange,提问作者Luke Puplett
相关产品推荐
相关产品推荐

