Xamarin.Forms应用无法找到JSON文件路径的技术求助
Xamarin.Forms读取JSON文件路径错误问题
开发Xamarin.Forms应用时,计划用JSON文件存储数据,但读取指定本地路径的JSON文件时持续报错,简化代码后问题仍未解决。
应用主程序代码
using System; using Xamarin.Forms; using Xamarin.Forms.Xaml; using TravelPack.Views; using System.Diagnostics; namespace TravelPack { public partial class App : Application { public App() { InitializeComponent(); //MainPage = new MainPage(); } protected override void OnStart() { Debug.WriteLine("---------------"); Debug.WriteLine(Environment.CurrentDirectory); TravelPack.OOP.Lists.InitializeLists(); } protected override void OnSleep() { } protected override void OnResume() { } } }
Lists类代码
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Text; using Newtonsoft.Json; namespace TravelPack.OOP { internal class Lists { private static List<Item> _items; private static List<Kit> _kits; private static List<TravelList> _travelLists; private static List<string> _weightUnits; private static List<string> _volumeUnits; private static List<string> _categories; public static void InitializeLists() { Lists._travelLists = new List<TravelList>(); Lists._items = new List<Item>(); Lists._kits = new List<Kit>(); Lists._weightUnits = new List<string>(); Lists._volumeUnits = new List<string>(); Lists._categories = new List<string>(); string filePath = @"D:\Documents\אישי\Projects\TravelPack\TravelPack\TravelPack\Data\BuiltInItems.JSON"; string json = File.ReadAllText(filePath);//error occurs here List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json); Lists._items.AddRange(items); } public static List<Item> GetItems() { return Lists._items; } public static List<Kit> GetKits() { return Lists._kits; } public static List<TravelList> GetTravelLists() { return Lists._travelLists; } public static List<string> GetWeightUnits() { return Lists._weightUnits; } public static List<string> GetVolumeUnits() { return Lists._volumeUnits; } public static List<string> GetCategories() { return Lists._categories; } public static void Add(Item item) { Lists._items.Add(item); } public static void Add(Kit kit) { Lists._kits.Add(kit); } public static void Add(TravelList list) { Lists._travelLists.Add(list); } public static void Add(string category) { Lists._categories.Add(category); } } }
报错信息
System.IO.FileNotFoundException
Message=Could not find file "/D:\Documents\אישי\Projects\TravelPack\TravelPack\TravelPack\Data\BuiltInItems.JSON"
尝试过移动文件到更短路径、复制完整路径,调用File.Exists()始终返回false。
问题根源
程序运行在模拟器中时,会在模拟器的文件系统中查找路径,而非本地开发机的解决方案目录。因此需要将数据文件部署到模拟器,并使用应用可访问的相对路径或平台特定路径。
解决步骤
1. 配置JSON文件的部署属性
在解决方案资源管理器中找到BuiltInItems.JSON文件,右键选择属性:
- 生成操作:设置为
Embedded Resource(嵌入到程序集)或Content(作为独立文件部署) - 如果选择
Content,需将复制到输出目录设置为如果较新则复制或始终复制
2. 使用正确的方式读取文件
方式一:读取嵌入资源
如果将文件设置为Embedded Resource,通过程序集读取内容:
public static void InitializeLists() { // 初始化集合代码不变... var assembly = typeof(Lists).GetTypeInfo().Assembly; // 资源名称格式:命名空间.文件夹名.文件名(注意文件夹层级用点分隔) string resourceName = "TravelPack.Data.BuiltInItems.JSON"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) { Debug.WriteLine($"找不到嵌入资源:{resourceName}"); return; } using (StreamReader reader = new StreamReader(stream)) { string json = reader.ReadToEnd(); List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json); Lists._items.AddRange(items); } } }
方式二:读取部署的Content文件
如果将文件设置为Content,使用平台特定的本地存储路径:
public static void InitializeLists() { // 初始化集合代码不变... // 获取应用本地存储目录 string localPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); string filePath = Path.Combine(localPath, "BuiltInItems.JSON"); if (!File.Exists(filePath)) { Debug.WriteLine($"文件不存在:{filePath}"); return; } string json = File.ReadAllText(filePath); List<Item> items = JsonConvert.DeserializeObject<List<Item>>(json); Lists._items.AddRange(items); }
3. 验证路径正确性
在代码中添加Debug.WriteLine(filePath)输出实际访问路径,通过模拟器的文件管理工具(如Android Studio的Device File Explorer)检查对应路径下是否存在目标文件。
内容的提问来源于stack exchange,提问作者Gael Pinto
相关产品推荐
相关产品推荐

