JProperty值ToString时日期格式变更,如何保留原始ISO格式生成查询参数
问题原因
你使用Newtonsoft.Json解析JSON时,默认会把符合ISO格式的字符串自动识别为DateTime类型,调用JValue.ToString()方法时会输出当前系统区域设置对应的本地化日期格式,因此丢失了原始的ISO 8601格式。
解决方案
方案1:解析时禁用日期自动识别(推荐)
加载JSON对象时通过配置关闭日期自动解析,让日期值保持原始字符串类型,调用ToString()即可直接拿到ISO格式内容:
// 解析JSON时添加配置,禁止自动识别日期类型 var json = JObject.Parse(yourJsonString, new JsonLoadSettings { DateParseHandling = DateParseHandling.None }); // 后续遍历逻辑不需要改动 var sb = new StringBuilder(); foreach (var c in json.Children().Cast<JProperty>()) { if (!string.IsNullOrWhiteSpace(c.Value.ToString())) { sb.Append($"&{c.Name}={HttpUtility.UrlEncode(c.Value.ToString())}"); } }
方案2:不改解析逻辑,单独处理日期类型输出
如果你需要保留DateTime类型的解析结果,可以在拼接参数时单独对日期类型做ISO格式化:
var sb = new StringBuilder(); foreach (var c in json.Children().Cast<JProperty>()) { if (c.Value.Type == JTokenType.Null || string.IsNullOrWhiteSpace(c.Value.ToString())) { continue; } string valueStr; if (c.Value.Type == JTokenType.Date) { // 序列化日期得到带引号的ISO字符串,去掉引号即可 valueStr = JsonConvert.SerializeObject(c.Value).Trim('"'); } else { valueStr = c.Value.ToString(); } sb.Append($"&{c.Name}={HttpUtility.UrlEncode(valueStr)}"); }
额外优化
你当前的拼接逻辑会导致最终查询串开头多一个&符号,可在最后拼接完成后裁剪掉首个字符,或者用QueryHelpers.AddQueryString等工具类直接构建查询参数,代码会更简洁。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

