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 foreach循环(没有json.net)

问题是您的JSON包含一个数组,并且考虑到XML没有数组的概念,JsonReaderWriterFactory如何将数组映射到XML元素并不是很明显。

确定这一点的一种方法是通读描述这种映射的JSON和XML之间的映射文档。但另一种方法是通过使用从获取XPath到XElement的答案之一来确定我们自己。找出每个元素的实际路径。使用这个答案,下面的代码:
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; }
}