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

Blazor+MonoGame(kniEngine)环境下读取本地JSON文件的方法咨询

Blazor读取JSON静态文件的可行方案

核心前提

Blazor WebAssembly(WASM)运行在浏览器沙箱中,无法直接访问服务器本地文件系统,只能通过HTTP请求访问wwwroot目录下的静态资源——这是你之前方法失效的核心原因。

步骤1:调整文件存放位置

把所有JSON文件移动到项目的wwwroot/Content/animations目录下(如果目录不存在就手动创建)。同时右键每个JSON文件→属性→设置复制到输出目录为「如果较新则复制」,确保发布时文件能被打包到wwwroot中。

步骤2:正确使用HttpClient读取

你之前说缺少Http引用,是因为没正确注入HttpClient:

  • 在Razor组件中直接注入:
    @inject HttpClient Http
    
  • 在C#服务类中通过构造函数注入:
    public class AnimationService
    {
        private readonly HttpClient _http;
    
        public AnimationService(HttpClient http)
        {
            _http = http;
        }
        // 后续读取逻辑写在这里
    }
    

步骤3:读取单个JSON文件

直接通过HTTP请求读取指定文件:

// 读取单个动画JSON
var jsonContent = await Http.GetStringAsync("Content/animations/walk.json");
// 反序列化为你的模型
var animation = JsonSerializer.Deserialize<AnimationModel>(jsonContent);

步骤4:获取目录下所有JSON文件(关键)

浏览器环境无法直接枚举服务器目录,所以需要手动维护一个文件清单:

  1. 在wwwroot/Content/animations下创建filelist.json,内容为所有JSON文件名的数组:
    [
      "walk.json",
      "run.json",
      "jump.json"
    ]
    
  2. 先读取这个清单,再遍历读取每个文件:
    // 读取文件清单
    var listJson = await Http.GetStringAsync("Content/animations/filelist.json");
    var fileNames = JsonSerializer.Deserialize<List<string>>(listJson);
    
    // 遍历读取每个JSON
    foreach (var fileName in fileNames)
    {
        var filePath = $"Content/animations/{fileName}";
        var json = await Http.GetStringAsync(filePath);
        // 处理每个动画数据
    }
    

常见坑点排查

  • 路径大小写:部分服务器(如Linux部署的Nginx)对路径大小写敏感,确保代码中的路径和实际文件路径完全一致。
  • 基地址问题:默认HttpClient的基地址是网站根目录,不要在路径前加wwwroot。
  • 静态资源缓存:如果修改文件后没生效,可尝试清空浏览器缓存或添加版本号(如Content/animations/walk.json?v=1)。

内容的提问来源于stack exchange,提问作者Mootfrost

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:50:07