【发布时间】:2014-01-19 10:27:29
【问题描述】:
我一直在制作 Minecraft 启动器。我有一个很长的 JSON 文件,其中包含启动 one 版本所需的所有库。此代码示例:
{
"id": "1.6.2",
"time": "2013-08-06T14:00:00+03:00",
"releaseTime": "2013-07-05T16:09:02+03:00",
"type": "release",
"minecraftArguments": "--username ${auth_player_name} --session ${auth_session} --version ${version_name} --gameDir ${game_directory} --assetsDir ${game_assets}",
"libraries": [
{
"name": "net.sf.jopt-simple:jopt-simple:4.5"
},
{
"name": "com.paulscode:codecjorbis:20101023"
},
所以你可以看到有一个名为libraries的数组。我可以使用 foreach 很好地查询“名称”中的值,但有时这会发生在 json 中:
{
"name": "org.lwjgl.lwjgl:lwjgl:2.9.0",
"rules": [
{
"action": "allow"
},
{
"action": "disallow",
"os": {
"name": "osx",
"version": "^10\\.5\\.\\d$"
}
}
]
},
如您所见,内部有一个名为rules 的数组。我需要在rules 中的os 中找到name 的值。我尝试过的任何事情都出现了异常并且不起作用。这是我目前用于解析代码的代码:
foreach (JToken lib in profilejsono["libraries"])
{
if ((lib["rules"][1]["os"].ToString() == "osx") || (lib["rules"][1]["os"].ToString() == "linux"))
{
availableLibs.Add(lib["name"].ToString());
}
}
代码的重点是不要添加适用于 OSX 或 Linux 的库(我稍后会添加该功能)。我该怎么做?
【问题讨论】:
-
你能分享一下你得到的确切例外吗?
-
System.NullReferenceException(对象引用未设置为对象的实例。
-
您收到此错误是因为您尝试达到
["os"]值的方式。foreach循环返回每个Jtoken,但实际上只有一个项目会返回lib["rules"][1]["os"]的值,否则你会得到null,因为该项目没有"os"属性。 -
有很多方法可以解决这个问题,但最简单的方法是额外检查是否有
lib["rules"].count >= 2,因为你想要第二个索引为[1]的元素,然后检查它是否有@ 987654337@ property 等等...我不说这是最好的方法,只是为了让您走上正确的轨道.. -
我的建议是在您的工作示例中发布新问题,无论您认为它有多糟糕,并寻求帮助以改进它。在这个问题中,您首先会发现为什么会出现此错误,如果我是您,我会问另一个问题,以了解处理这种情况的最佳方法。