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文件(关键)
浏览器环境无法直接枚举服务器目录,所以需要手动维护一个文件清单:
- 在
wwwroot/Content/animations下创建filelist.json,内容为所有JSON文件名的数组:[ "walk.json", "run.json", "jump.json" ] - 先读取这个清单,再遍历读取每个文件:
// 读取文件清单 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
相关产品推荐
相关产品推荐

