使用Json.NET反序列化时如何生成小写键名的JSON
实现模型反序列化后得到小写键名JSON的方案
嗨,这个需求其实挺常见的,我给你整理了几种主流技术栈的实现方式,你可以对应自己的开发场景来用:
Java 场景(Jackson 框架)
Jackson是Java生态里处理JSON的主流框架,有两种方式实现:
方式1:全局配置(推荐批量处理)
如果想让所有模型的字段都转成小写键名,不需要给每个字段加注解,直接配置ObjectMapper:
ObjectMapper objectMapper = new ObjectMapper(); // 自定义命名策略,将所有字段名转为小写 objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategy() { @Override public String nameForField(MapperConfig<?> config, AnnotatedField field, String defaultName) { return defaultName.toLowerCase(); } }); // 反序列化示例(假设你的模型类是User) User user = objectMapper.readValue(jsonString, User.class); // 序列化时也会输出小写键名的JSON String lowerCaseJson = objectMapper.writeValueAsString(user);
如果是Spring Boot项目,还可以通过配置文件全局生效,在application.yml里加:
spring: jackson: property-naming-strategy: LOWER_CASE
方式2:单个字段注解
如果只需要特定字段转小写,给字段加@JsonProperty注解指定小写键名:
public class User { @JsonProperty("username") private String UserName; @JsonProperty("age") private int Age; // getter/setter 省略 }
C# 场景
C#里常用的JSON库有Newtonsoft.Json(Json.NET)和官方的System.Text.Json,两种都支持小写键名配置:
方案1:Newtonsoft.Json
全局配置
var serializerSettings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { NamingStrategy = new LowerCaseNamingStrategy() } }; // 反序列化 User user = JsonConvert.DeserializeObject<User>(jsonString, serializerSettings); // 序列化输出小写键名JSON string lowerCaseJson = JsonConvert.SerializeObject(user, serializerSettings);
单个字段配置
给字段加[JsonProperty]注解:
public class User { [JsonProperty("username")] public string UserName { get; set; } [JsonProperty("age")] public int Age { get; set; } }
方案2:System.Text.Json(官方库)
全局配置
var jsonOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.LowerCase }; // 反序列化 User user = JsonSerializer.Deserialize<User>(jsonString, jsonOptions); // 序列化输出小写键名JSON string lowerCaseJson = JsonSerializer.Serialize(user, jsonOptions);
Python 场景
Python常用的JSON处理方案包括Pydantic(适合模型驱动开发)和原生JSON模块:
方案1:Pydantic(推荐)
通过模型配置实现全局小写键名:
from pydantic import BaseModel, ConfigDict class User(BaseModel): # 配置别名生成器为小写,同时允许通过原字段名赋值 model_config = ConfigDict(alias_generator=lambda field_name: field_name.lower(), populate_by_name=True) UserName: str Age: int # 反序列化(支持原字段名或小写键名的JSON) user = User.model_validate_json('{"UserName": "Alice", "Age": 30}') # 序列化输出小写键名JSON lowerCaseJson = user.model_dump_json(by_alias=True)
方案2:原生JSON模块
自定义编码器实现键名转小写:
import json class LowerCaseJsonEncoder(json.JSONEncoder): def encode(self, obj): if isinstance(obj, dict): # 递归处理字典的键转小写 lower_dict = {k.lower(): self.encode(v) for k, v in obj.items()} return json.dumps(lower_dict) elif isinstance(obj, list): # 递归处理列表元素 return json.dumps([self.encode(item) for item in obj]) else: # 基础类型直接序列化 return json.dumps(obj) # 使用示例 user_dict = {"UserName": "Bob", "Age": 25} lowerCaseJson = LowerCaseJsonEncoder().encode(user_dict)
如果你的技术栈不在上面,随时告诉我具体语言,我再给你针对性的方案~
内容的提问来源于stack exchange,提问作者Share
相关产品推荐
相关产品推荐

