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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:50