如何从ResX文件读取JSON?路径与读取逻辑问题排查
解决ResX读取JSON的路径问题+提取国家名称
一、先搞定ResX文件的正确路径
你写的@"\.\resources.resx"肯定找不到文件,程序默认会去bin目录里找,给你两种靠谱的写法:
1. 从项目根目录读取(推荐)
如果resources.resx在项目根目录,用AppContext.BaseDirectory拿到程序运行的基目录,再往上跳回到项目根:
string resxPath = Path.Combine(AppContext.BaseDirectory, @"..\..\..\resources.resx");
这里的..\..\..是从bin目录往上退3级(对应常规.NET项目结构),如果你的项目层级不一样,调整..的数量就行。
2. 让文件自动复制到bin目录(更省事)
右键项目里的resources.resx,属性里把复制到输出目录改成如果较新则复制或者始终复制,这样编译时文件会自动到bin文件夹,直接写文件名就行:
string resxPath = "resources.resx";
二、JSON读取的错误修正
你直接把resxSet.GetObject("allCivs")转成FileStream完全错了!ResX里存的应该是JSON的文本内容,不是文件流。正确的步骤是:
- 从ResX里取出
allCivs对应的字符串 - 用
JsonDocument.Parse解析这个字符串 - 遍历根节点的属性键,就是你要的国家名称
修正后的完整代码:
using System.Resources; using System.Text.Json; using System.IO; // 选一种路径写法 string resxPath = Path.Combine(AppContext.BaseDirectory, @"..\..\..\resources.resx"); // 或者复制到输出目录后用:string resxPath = "resources.resx"; using (ResXResourceSet resxSet = new ResXResourceSet(resxPath)) { // 取出JSON字符串,别再转FileStream了! string jsonContent = resxSet.GetString("allCivs"); if (string.IsNullOrEmpty(jsonContent)) { // 处理找不到allCivs的情况,比如提示或者返回 return; } using (JsonDocument document = JsonDocument.Parse(jsonContent)) { JsonElement root = document.RootElement; // 遍历所有国家名称 foreach (JsonProperty property in root.EnumerateObject()) { string countryName = property.Name; // 比如"Austria"、"America" Console.WriteLine(countryName); // 如果要读国家的详细数据,用property.Value就行 // 比如拿国旗路径:string flag = property.Value.GetProperty("Флаг").GetString(); } } }
三、几个要注意的点
- 确认ResX里的
allCivs项是字符串类型,存的是allCivs.json的完整文本,不是文件路径。 - 检查你的JSON格式!你给的示例里有语法错误,正确的结构应该是一个大对象包含所有国家的键值对,不能写成对象数组:
{ "Austria": { ... }, "America": { ... } }
内容的提问来源于stack exchange,提问作者kirin
相关产品推荐
相关产品推荐

