如何在 .NET MAUI 中加载 json 文件?
引言:按core传统方式添加 AddJsonFile("appsettings.json") 在windows平台和ssr工作正常,但是在 ios 和 android 无法用这种方式,因为资源生成方式不一样. 使用内置资源方式不够灵活而且 ios 平台会提示不能复制 json 文件到目录,于是进行了几天的研究,终于能正确使用了.
https://img2022.cnblogs.com/blog/1980213/202211/1980213-20221114193259100-1999902780.png
资源文件夹
[*]官方工程 Resources\Raw\文件夹 AboutAssets.txt 文件说明
您希望与应用程序一起部署的任何原始资产都可以放置在此目录(和子目录)。 将资产部署到您的应用程序, 由 `.csproj` 中的以下 `MauiAsset` 构建操作自动处理。
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup> <MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
这些文件将与您的包一起部署,并且可以使用 Essentials 访问:
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>async Task LoadMauiAsset()
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>{
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt");
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>using var reader = new StreamReader(stream);
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>var contents = reader.ReadToEnd();
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>}复制一份txt文件按操作复现成功.
[*]直接丢入 appsettings.json 编译到ios平台提示错误不能复制 json 文件到目录, 经google,找到方案,需要项目文件属性中 Remove 文件
相关错误提示
The path 'XXXXXXX\appsettings.json' would result in a file outside of the app bundle and cannot be used.
The path '..\..\..\..\..\..\..\Repos\BlazorMaui\BlazorMaui\appsettings.json' would result in a file outside of the app bundle and cannot be used.
最终方案:
[*]appsettings.json文件直接放工程根目录
[*]文件属性生成操作为 MauiAsset 和 不复制
[*]需要在项目属性中 Remove 文件
https://img2022.cnblogs.com/blog/1980213/202211/1980213-20221114192755351-2147254704.png
项目文件
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><Content Remove="appsettings.json" />
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup></ItemGroup>
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><MauiAsset Include="appsettings.json">
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><CopyToOutputDirectory>Never</CopyToOutputDirectory>
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup></MauiAsset>
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup></ItemGroup> 读取配置文件代码
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>async static Task<Stream> LoadMauiAsset()
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>{
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>try
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>{
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>using var stream = await FileSystem.OpenAppPackageFileAsync("appsettings.json");
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>using var reader = new StreamReader(stream);
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>var contents = reader.ReadToEnd();
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>Console.WriteLine("OpenAppPackageFileAsync => " + contents);
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>return stream;
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>}
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>catch (Exception e)
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>{
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>Console.WriteLine("OpenAppPackageFileAsync Exception => " + e.Message);
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>}
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>return null;
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup><ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>}附加到 builder.Configuration
var stream = LoadMauiAsset().Result;
builder.Configuration.AddJsonStream(stream);附:使用内置资源方式
需要在项目属性中设置生成操作为嵌入资源
<ItemGroup>
<EmbeddedResource Include="appsettings.json" />
</ItemGroup>代码 BlazorMaui 为工程名
var a = Assembly.GetExecutingAssembly();
using var stream = a.GetManifestResourceStream("BlazorMaui.appsettings.json");
builder.Configuration.AddJsonStream(stream);项目地址
https://github.com/densen2014/BlazorMaui
https://gitee.com/densen2014/BlazorMaui
关联项目
FreeSql QQ群:4336577、8578575、52508226
BA & Blazor QQ群:795206915、675147445
知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名AlexChow(包含链接: https://github.com/densen2014 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系 。
AlexChow
今日头条 | 博客园 | 知乎 | Gitee | GitHub
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]