C# 使用Json详细指南
一、Json处理方式概述在C#中处理Json主要有两种方式Newtonsoft.Json (Json.NET) - 最流行的第三方库System.Text.Json - .NET Core 3.0 内置的高性能库二、Newtonsoft.Json (Json.NET) 使用详解基础使用usingNewtonsoft.Json;// 序列化PersonpersonnewPerson{Name张三,Age30};stringjsonJsonConvert.SerializeObject(person);// 反序列化Personperson2JsonConvert.DeserializeObjectPerson(json);// 格式化输出stringformattedJsonJsonConvert.SerializeObject(person,Formatting.Indented);高级配置// 使用JsonSerializerSettings配置varsettingsnewJsonSerializerSettings{// 格式化输出FormattingFormatting.Indented,// 处理循环引用ReferenceLoopHandlingReferenceLoopHandling.Ignore,// 空值处理NullValueHandlingNullValueHandling.Ignore,// 日期格式DateFormatStringyyyy-MM-dd HH:mm:ss,// 类型名称处理TypeNameHandlingTypeNameHandling.Auto,// 属性名大小写不敏感ContractResolvernewCamelCasePropertyNamesContractResolver()};stringjsonJsonConvert.SerializeObject(person,settings);使用特性控制序列化publicclassProduct{[JsonProperty(product_id)]publicintId{get;set;}[JsonProperty(product_name)]publicstringName{get;set;}[JsonIgnore]// 忽略此属性publicdecimalInternalPrice{get;set;}[JsonProperty(NullValueHandlingNullValueHandling.Ignore)]publicstringDescription{get;set;}[JsonConverter(typeof(JavaScriptDateTimeConverter))]publicDateTimeCreateTime{get;set;}}使用JObject动态处理usingNewtonsoft.Json.Linq;stringjson { name: 张三, age: 30, scores: { math: 95, english: 88 }, hobbies: [篮球, 音乐] };JObjectobjJObject.Parse(json);// 获取值stringnameobj[name]?.Valuestring();intageobj[age]?.Valueint();// 遍历属性foreach(varpropertyinobj.Properties()){Console.WriteLine(${property.Name}:{property.Value});}// 修改值obj[age]31;// 添加新属性obj[city]上海;// 删除属性obj.Remove(hobbies);// 查询LINQ操作varhighScoresobj[scores]?.ChildrenJProperty().Where(xx.Value.Valueint()90);处理匿名类型// 序列化匿名对象varanonymousObjnew{Name赵六,Age35,City广州};stringjsonJsonConvert.SerializeObject(anonymousObj);// 反序列化为匿名类型vartemplatenew{Name,Age0,City};varresultJsonConvert.DeserializeAnonymousType(json,template);Console.WriteLine(result.Name);三、System.Text.Json 使用详解基础序列化与反序列化usingSystem.Text.Json;// 定义实体类publicclassPerson{publicstringName{get;set;}publicintAge{get;set;}publicstringEmail{get;set;}publicboolIsActive{get;set;}publicDateTimeCreateTime{get;set;}}PersonpersonnewPerson{Name张三,Age30,Emailzhangsanexample.com,IsActivetrue,CreateTimeDateTime.Now};// 序列化对象为Json字符串stringjsonStringJsonSerializer.Serialize(person);Console.WriteLine(jsonString);// 反序列化Json字符串为对象stringjson{Name:李四,Age:25,Email:lisiexample.com,IsActive:true};Personperson2JsonSerializer.DeserializePerson(json);配置序列化选项varoptionsnewJsonSerializerOptions{// 格式化输出缩进WriteIndentedtrue,// 属性命名策略PropertyNamingPolicyJsonNamingPolicy.CamelCase,// 忽略值为null的属性IgnoreNullValuestrue,// 忽略只读属性IgnoreReadOnlyPropertiestrue,// 允许在反序列化时使用不区分大小写的属性匹配PropertyNameCaseInsensitivetrue,// 编码器设置EncoderSystem.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping};stringjsonStringJsonSerializer.Serialize(person,options);处理复杂类型// 处理集合ListPersonpeoplenewListPerson{newPerson{Name张三,Age30},newPerson{Name李四,Age25}};stringjsonArrayJsonSerializer.Serialize(people);ListPersondeserializedPeopleJsonSerializer.DeserializeListPerson(jsonArray);// 处理字典Dictionarystring,objectdictnewDictionarystring,object{[name]王五,[age]28,[scores]new[]{90,85,95}};stringjsonDictJsonSerializer.Serialize(dict);vardeserializedDictJsonSerializer.DeserializeDictionarystring,object(jsonDict);自定义转换器// 自定义DateTime格式转换器publicclassCustomDateTimeConverter:JsonConverterDateTime{privatereadonlystring_formatyyyy-MM-dd HH:mm:ss;publicoverrideDateTimeRead(refUtf8JsonReaderreader,TypetypeToConvert,JsonSerializerOptionsoptions){returnDateTime.ParseExact(reader.GetString(),_format,null);}publicoverridevoidWrite(Utf8JsonWriterwriter,DateTimevalue,JsonSerializerOptionsoptions){writer.WriteStringValue(value.ToString(_format));}}// 使用自定义转换器publicclassEvent{publicstringTitle{get;set;}[JsonConverter(typeof(CustomDateTimeConverter))]publicDateTimeEventTime{get;set;}}varoptionsnewJsonSerializerOptions();options.Converters.Add(newCustomDateTimeConverter());使用JsonDocument动态解析stringjsonData { name: 测试用户, age: 28, address: { city: 北京, street: 长安街 }, hobbies: [读书, 游泳, 编程] };usingJsonDocumentdocumentJsonDocument.Parse(jsonData);JsonElementrootdocument.RootElement;// 获取属性stringnameroot.GetProperty(name).GetString();intageroot.GetProperty(age).GetInt32();// 处理嵌套对象JsonElementaddressroot.GetProperty(address);stringcityaddress.GetProperty(city).GetString();// 处理数组JsonElementhobbiesroot.GetProperty(hobbies);foreach(JsonElementhobbyinhobbies.EnumerateArray()){Console.WriteLine(hobby.GetString());}四、选择建议1. 选择建议使用 System.Text.Json 的场景.NET Core 3.0 项目追求高性能和低内存占用需要AOT编译支持简单到中等复杂度的Json处理使用 Newtonsoft.Json 的场景需要复杂的Json处理功能维护遗留项目需要XML注释支持需要更灵活的配置选项.NET Framework项目五、实际应用示例1. 读取配置文件// appsettings.json{Database:{ConnectionString:Serverlocalhost;DatabaseMyDB;User Idsa;Password123;,Timeout:30},Logging:{Level:Information,FilePath:logs/app.log}}// 配置类publicclassDatabaseConfig{publicstringConnectionString{get;set;}publicintTimeout{get;set;}}publicclassLoggingConfig{publicstringLevel{get;set;}publicstringFilePath{get;set;}}publicclassAppConfig{publicDatabaseConfigDatabase{get;set;}publicLoggingConfigLogging{get;set;}}// 读取配置stringjsonContentFile.ReadAllText(appsettings.json);AppConfigconfigJsonSerializer.DeserializeAppConfig(jsonContent);2. Web API 中的Json处理// ASP.NET Core 控制器[ApiController][Route(api/[controller])]publicclassUsersController:ControllerBase{[HttpPost]publicIActionResultCreateUser([FromBody]UserDtouserDto){// 自动反序列化Json到UserDtoreturnOk(new{successtrue,useruserDto});}[HttpGet({id})]publicIActionResultGetUser(intid){varusernew{Idid,Name张三,Age30};// 自动序列化为JsonreturnOk(user);}}3. 处理Json文件// 写入Json文件publicasyncTaskWriteToJsonFileT(stringfilePath,Tdata){varoptionsnewJsonSerializerOptions{WriteIndentedtrue};stringjsonStringJsonSerializer.Serialize(data,options);awaitFile.WriteAllTextAsync(filePath,jsonString);}// 读取Json文件publicasyncTaskTReadFromJsonFileT(stringfilePath){stringjsonStringawaitFile.ReadAllTextAsync(filePath);returnJsonSerializer.DeserializeT(jsonString);}六、常见问题与解决方案1. 循环引用处理// Newtonsoft.JsonvarsettingsnewJsonSerializerSettings{ReferenceLoopHandlingReferenceLoopHandling.Ignore// 或使用 PreserveObjectReferences 保留引用// PreserveReferencesHandling PreserveReferencesHandling.Objects};// System.Text.Json (.NET 6)varoptionsnewJsonSerializerOptions{ReferenceHandlerReferenceHandler.Preserve};2. 处理大文件// 使用流式处理处理大Json文件usingFileStreamfsFile.OpenRead(large.json);awaitforeach(variteminJsonSerializer.DeserializeAsyncEnumerablePerson(fs)){ProcessPerson(item);}3. 自定义属性命名策略// System.Text.Json 自定义命名策略publicclassUpperCaseNamingPolicy:JsonNamingPolicy{publicoverridestringConvertName(stringname)name.ToUpperInvariant();}varoptionsnewJsonSerializerOptions{PropertyNamingPolicynewUpperCaseNamingPolicy()};七、总结System.Text.Json 是官方推荐的高性能Json库适合大多数现代应用Newtonsoft.Json 功能更丰富适合复杂场景和遗留项目