.NET Core 6异步读取JSON反序列化后对象属性为空求解
解决System.Text.Json反序列化appsettings.json属性为空的问题
下面列出最可能导致该问题的原因及对应的修复方案:
1. JSON结构与类层级不匹配
这是最常见的问题。比如你的appsettings.json结构如下:
{ "ConnectionStrings": { "DefaultDB": "Server=localhost;Database=TestDB;Trusted_Connection=True" } }
但你的DBConnectionString类直接定义了DefaultDB属性,未包含上层的ConnectionStrings节点,直接反序列化整个JSON文件自然找不到对应属性。
修复:
要么调整类结构匹配JSON层级:
public class AppSettingsRoot { public DBConnectionString ConnectionStrings { get; set; } } public class DBConnectionString { public string DefaultDB { get; set; } }
反序列化时用AppSettingsRoot作为目标类型,再取ConnectionStrings属性。
或者先解析JSON到指定节点再反序列化:
var jsonContent = await File.ReadAllTextAsync("appsettings.json"); using var doc = JsonDocument.Parse(jsonContent); var connSection = doc.RootElement.GetProperty("ConnectionStrings"); var connStrings = JsonSerializer.Deserialize<DBConnectionString>(connSection);
2. 属性大小写不匹配
System.Text.Json默认严格区分大小写,如果JSON里的键是defaultdb,而类属性是DefaultDB,就会匹配失败。
修复:
两种方式任选其一:
- 给属性加
[JsonPropertyName]特性指定JSON键名:
public class DBConnectionString { [JsonPropertyName("defaultdb")] public string DefaultDB { get; set; } }
- 反序列化时配置忽略大小写:
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; var connStrings = await JsonSerializer.DeserializeAsync<DBConnectionString>(stream, options);
3. 文件读取异常
异步读取文件时如果流位置不对,或者没读取完整内容,会导致反序列化出空对象。比如打开流后没有重置位置,或者流已经被读取过。
修复:
要么重置流位置:
using var stream = new FileStream("appsettings.json", FileMode.Open); stream.Seek(0, SeekOrigin.Begin); // 确保从流的起始位置读取 var connStrings = await JsonSerializer.DeserializeAsync<DBConnectionString>(stream, options);
或者更简单的方式,直接读取文件内容为字符串再反序列化:
var jsonText = await File.ReadAllTextAsync("appsettings.json"); var connStrings = JsonSerializer.Deserialize<DBConnectionString>(jsonText, options);
4. 类定义问题
检查你的DBConnectionString类:
- 属性必须是public,私有/内部属性无法被System.Text.Json反序列化。
- 类必须有无参构造函数(默认的无参构造即可,除非你用特性指定了其他构造)。
额外推荐:用.NET Core内置配置系统
其实在.NET Core中,官方更推荐用内置的配置系统来读取appsettings,它能自动处理层级、环境配置、重载等问题,比手动反序列化更可靠:
var configBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false); var config = configBuilder.Build(); var connStrings = config.GetSection("ConnectionStrings").Get<DBConnectionString>();
内容的提问来源于stack exchange,提问作者Flex
相关产品推荐
相关产品推荐

