我目前正在尝试创建一个小型启动器来解决使用现有的Minecraft启动器的一些问题。 我正在尝试读取.json文件以获取我需要的所有信息。 如果您需要查看.json文件here。
如果我只需要一个像
这样的信息,我就可以使用它string clienturl = readJson("//downloads/client/url");
用这个:
private string readJson(string element)
{
string json = File.ReadAllText(Path.Combine(appPath + "1.10.2.json"));
var jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(json), new System.Xml.XmlDictionaryReaderQuotas());
var root = XElement.Load(jsonReader);
return root.XPathSelectElement(element).Value;
}
现在的问题是我需要获取所有其他文件的信息。 “元素”将是:
libraries/downloads/artifact/path
libraries/downloads/artifact/url
但显然“path”和“url”有一个条目,所以我需要一个foreach循环。 我需要在上面的代码中进行哪些更改才能使其与foreach循环一起使用?
抱歉我的英文不好,我希望不要难以理解。
.json的小预览,以防你不想下载文件:
"libraries": [
{
"name": "com.mojang:netty:1.6",
"downloads": {
"artifact": {
"size": 7877,
"sha1": "4b75825a06139752bd800d9e29c5fd55b8b1b1e4",
"path": "com/mojang/netty/1.6/netty-1.6.jar",
"url": "https://libraries.minecraft.net/com/mojang/netty/1.6/netty-1.6.jar"
}
}
},
{
"name": "oshi-project:oshi-core:1.1",
"downloads": {
"artifact": {
"size": 30973,
"sha1": "9ddf7b048a8d701be231c0f4f95fd986198fd2d8",
"path": "oshi-project/oshi-core/1.1/oshi-core-1.1.jar",
"url": "https://libraries.minecraft.net/oshi-project/oshi-core/1.1/oshi-core-1.1.jar"
}
}
},
{
"name": "net.java.dev.jna:jna:3.4.0",
"downloads": {
"artifact": {
"size": 1008730,
"sha1": "803ff252fedbd395baffd43b37341dc4a150a554",
"path": "net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar",
"url": "https://libraries.minecraft.net/net/java/dev/jna/jna/3.4.0/jna-3.4.0.jar"
}
}
}
]
答案 0 :(得分:0)
问题在于你的JSON包含一个数组,并且由于XML没有数组的概念,JsonReaderWriterFactory
如何将数组映射到XML元素并不是很明显。
确定这一点的一种方法是阅读描述此映射的文档Mapping Between JSON and XML。但另一个只是通过使用Get the XPath to an XElement?中的一个答案找出每个元素的实际路径来自行确定。使用this answer,以下代码:
var paths = root.DescendantsAndSelf().Select(e => e.GetAbsoluteXPath()).ToList();
Debug.WriteLine(String.Join("\n", paths));
生成输出,如:
/root/libraries
/root/libraries/item[1]
/root/libraries/item[1]/name
/root/libraries/item[1]/downloads
/root/libraries/item[1]/downloads/artifact
/root/libraries/item[1]/downloads/artifact/size
/root/libraries/item[1]/downloads/artifact/sha1
/root/libraries/item[1]/downloads/artifact/path
/root/libraries/item[1]/downloads/artifact/url
/root/libraries/item[2]
/root/libraries/item[2]/name
/root/libraries/item[2]/downloads
/root/libraries/item[2]/downloads/artifact
/root/libraries/item[2]/downloads/artifact/size
/root/libraries/item[2]/downloads/artifact/sha1
/root/libraries/item[2]/downloads/artifact/path
/root/libraries/item[2]/downloads/artifact/url
因此,正如您所看到的,每个数组项都放在一个合成的<item>
节点中。
因此,您可以按如下方式查询路径和网址:
var files = root
.XPathSelectElements("libraries/item/downloads/artifact")
.Select(e => new PathAndUrl { Path = (string)e.Element("path"), Url = (string)e.Element("url") })
.ToList();
将结果放入以下类的列表中:
public class PathAndUrl
{
public string Path { get; set; }
public string Url { get; set; }
}