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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:09:05