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

Newtonsoft JSON序列化HttpContext Headers出现$type/$value的原因及解决

序列化HttpContext请求头的差异原因及解决方法

差异原因

  1. 直接序列化Headers的处理逻辑:HttpContext.Request.Headers的类型是IHeaderDictionary,Newtonsoft.Json针对ASP.NET Core的这个集合类型有内置序列化逻辑,会自动将其中的StringValues类型值转换为原生数组格式输出,不会附带类型信息。
  2. 存入ExpandoObject后的处理逻辑:当你把StringValues(即使调用了AsEnumerable(),本质还是StringValues实例)存入ExpandoObject(作为IDictionary<string, object?>)时,Newtonsoft.Json无法识别这个自定义集合类型,会采用默认序列化规则:输出类型元信息$type,并将集合内部值放在$values字段中。

解决方法

要让修改后的字典和直接序列化Headers的格式一致,有三种可行方案:

方案一:将StringValues转为原生数组

在赋值时把StringValues转换为string[],Newtonsoft会直接序列化为数组:

IDictionary<string, object?> headers = new ExpandoObject();
foreach (var header in ctx.Request.Headers.Where(x => x.Key != "Cookie")) {
    headers[header.Key] = header.Value.ToArray(); // 转为字符串数组
}
string serialized = JsonConvert.SerializeObject(headers);

方案二:使用自定义转换器处理StringValues

编写JsonConverter指定StringValues的序列化方式,让它输出为数组:

public class StringValuesConverter : JsonConverter<StringValues>
{
    public override void WriteJson(JsonWriter writer, StringValues value, JsonSerializer serializer)
    {
        // 把StringValues转为数组后序列化
        serializer.Serialize(writer, value.ToArray());
    }

    public override StringValues ReadJson(JsonReader reader, Type objectType, StringValues existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        // 反序列化时还原为StringValues
        var values = serializer.Deserialize<string[]>(reader);
        return new StringValues(values);
    }
}

序列化时指定该转换器:

var settings = new JsonSerializerSettings
{
    Converters = { new StringValuesConverter() }
};
string serialized = JsonConvert.SerializeObject(headers, settings);

方案三:直接构建Dictionary<string, string[]>

跳过ExpandoObject,直接创建值类型为string[]的字典,从根源上避免类型识别问题:

var headers = ctx.Request.Headers
    .Where(x => x.Key != "Cookie")
    .ToDictionary(kv => kv.Key, kv => kv.Value.ToArray());
string serialized = JsonConvert.SerializeObject(headers);

内容的提问来源于stack exchange,提问作者Jez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:47:32