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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:50:58