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
相关产品推荐
相关产品推荐

