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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:10:50