Json foreach循环(没有json.net)
本文关键字:json net 没有 foreach 循环 Json | 更新日期: 2023-09-27 17:51:19
我目前正在尝试创建一个小型启动器来解决使用minecraft现有启动器的一些问题。我试图读取一个。json文件,以获得我需要的所有信息。如果你需要看一下这里的。json文件。
如果我只需要像
这样的单个信息,我就可以工作了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
,但显然有不止一个条目"路径"answers"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"
}
}
}
]
问题是您的JSON包含一个数组,并且考虑到XML没有数组的概念,JsonReaderWriterFactory
如何将数组映射到XML元素并不是很明显。
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>
节点中。
因此,您可以按照如下方式查询路径和url:
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; }
}