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

C#中JsonNamingPolicy.SnakeCaseLower不生效问题求助

问题原因

当你将JSON反序列化为object类型时,System.Text.Json会把JSON对象解析为JsonElement(.NET 5及以上版本),它是原始JSON结构的只读视图,保存了原始的键名与值。序列化JsonElement时,序列化器会直接输出原始内容,不会应用任何命名策略,所以无论你怎么设置PropertyNamingPolicy,输出的JSON都和原始一致。

解决方案

方案一:使用强类型模型(推荐)

定义与JSON结构匹配的强类型类,反序列化为该类实例后,序列化时命名策略会正常生效:

using System.Text.Json;

public class MyParameterModel
{
    public string MyImportantParameter { get; set; }
}

string json = "{\"MyImportantParameter\":\"MyContent\"}";

var obj = JsonSerializer.Deserialize<MyParameterModel>(json);

JsonSerializerOptions opts = new() { PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower };
string json2 = JsonSerializer.Serialize(obj, opts);
// 输出:{"my_important_parameter":"MyContent"}

方案二:反序列化为字典并配置键命名策略

如果无法定义强类型类,可以反序列化为Dictionary<string, object>,同时在序列化选项中指定DictionaryKeyPolicy,让字典的键也应用命名策略:

using System.Text.Json;
using System.Collections.Generic;

string json = "{\"MyImportantParameter\":\"MyContent\"}";

var obj = JsonSerializer.Deserialize<Dictionary<string, object>>(json);

JsonSerializerOptions opts = new() 
{ 
    PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower,
    DictionaryKeyPolicy = JsonNamingPolicy.SnakeCaseLower
};
string json2 = JsonSerializer.Serialize(obj, opts);
// 输出:{"my_important_parameter":"MyContent"}

另外,如果你是处理gRPC相关的JSON,通常gRPC工具会自动生成对应的强类型模型,直接使用这些生成的类会更稳妥,也能避免手动处理命名的麻烦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:22:42