阅读json文件并根据文件数据下载文件

时间:2016-01-23 20:01:16

标签: c# json hash json.net minecraft

这需要解释很多事情,所以如果我不能彻底解释我正在寻找的东西,我会提前道歉,如果你需要我澄清任何问题,我会尽我所能。< / p>

所以我在C#中制作了一个Minecraft启动器,我已经到了需要下载资源的部分,在assets文件夹中有两个文件夹索引和对象,现在我将专注于索引夹。我已经从http://s3.amazonaws.com/Minecraft.Download/indexes/1.7.10.json下载了1.7.10.json的启动器(我建议你下载文件以便查看整个文件,下载它不需要任何帐户。)问题来自于我试图阅读1.7.10.json我已经尝试了各种我能想到的方式,我也尝试过寻找在线阅读文件的方法,但它们似乎都没有用。这就是说我能够使用此代码读取文件并对.json文件进行一些编辑。

        public void SevenTenAssets()
    {
        string root = @"C:\SamplePack1";
        string Index = (root + "\\.minecraft\\assets\\indexes\\");

        using (StreamReader r = new StreamReader(Index + "1.7.10.json"))
        {
            string json = r.ReadToEnd();
            DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);
            DataTable dataTable = dataSet.Tables["objects"];

            foreach (DataRow row in dataTable.Rows)
            {
                Console.WriteLine(row["hash"]);
            }
        }


    }

但是我不相信我能够分发编辑过的文件,而不是mojang拥有的服务器。所以这种方法确实可以使用。

但这不是唯一的问题。说一下,我能够读取未经编辑的文件,我仍然需要将每个哈希值都插入并将其插入此URL http://resources.download.minecraft.net/(哈希的前2个十六进制字母)/(整个哈希)以下载相关文件用哈希说。希望这个例子能说明一点:

在1.7.10.json文件中,代码如下所示。

{"objects": {
"realms/lang/de_DE.lang": {
  "hash": "729b2c09d5c588787b23127eeda2730f9c039194",
  "size": 7784
},
"realms/lang/cy_GB.lang": {
  "hash": "7b52463b2df4685d2d82c5d257fd5ec79843d618",
  "size": 7688
},

想象一下文件中总共有686个哈希值,但无论如何我需要将每个哈希值取出来,例如第一个哈希值729b2c09d5c588787b23127eeda2730f9c039194

然后复制每个哈希的前两个字符并创建一个以前两个字符命名的文件夹,因此在这个哈希中它将是一个名为72的文件夹。一旦在前面提到的objects文件夹中创建了该文件夹,就需要去到之前提到的链接(我不能在此发布它因为我有不到10个声誉而且不能发布超过2个链接,但它是具有resource.download.minecraft而不是s3.amazonaws链接的链接)

将与所述哈希关联的文件下载到名为72的文件夹中。 你很可能会看到“(哈希的前2个十六进制字母)/(整个哈希)”部分网址,因为要下载与哈希相关联的文件,它需要取得has的前两个字符,在这种情况下它是72,然后添加一个/然后和整个哈希将下载该文件。您可能也会认为我可以将链接放在代码中而不必阅读json,但实际上我需要让它读取.json文件,因为它需要使用.json的多个版本(IE:1.7.10) .json,1.8.json,等等)。 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

<强>更新

包含自定义,仅限运行时的属性名称的JSON对象,例如your updated link处显示的JSON:

{
  "objects": {
    "realms/lang/de_DE.lang": {
      "hash": "729b2c09d5c588787b23127eeda2730f9c039194",
      "size": 7784
    },
    "realms/lang/cy_GB.lang": {
      "hash": "7b52463b2df4685d2d82c5d257fd5ec79843d618",
      "size": 7688
    }
  }
}

可以反序列化为字典。见Deserialize a Dictionary。因此,可以使用以下数据模型:

public class HashAndSize
{
    public string hash { get; set; }
    public long size { get; set; }
}

public class ObjectTable
{
    public Dictionary<string, HashAndSize> objects { get; set; }
}

使用反序列化如下:

        var url = @"http://s3.amazonaws.com/Minecraft.Download/indexes/1.7.10.json";

        ObjectTable root;

        using (var wc = new System.Net.WebClient())
        using (var stream = wc.OpenRead(url))
        using (var textReader = new StreamReader(stream))
        using (var reader = new JsonTextReader(textReader))
        {
            root = JsonSerializer.CreateDefault().Deserialize<ObjectTable>(reader);
        }

"realms/lang/cy_GB.lang"字符串成为字典键。

原始答案

我将当前显示在您的http://s3.amazonaws.com/Minecraft.Download/versions/1.7.10/1.7.10.json链接上的JSON上传到http://json2csharp.com/,后者会自动为我生成以下课程:

public class Natives
{
    public string linux { get; set; }
    public string windows { get; set; }
    public string osx { get; set; }
}

public class Extract
{
    public List<string> exclude { get; set; }
}

public class Os
{
    public string name { get; set; }
}

public class Rule
{
    public string action { get; set; }
    public Os os { get; set; }
}

public class Library
{
    public string name { get; set; }
    public Natives natives { get; set; }
    public Extract extract { get; set; }
    public List<Rule> rules { get; set; }
}

public class RootObject
{
    public string id { get; set; }
    public string time { get; set; }
    public string releaseTime { get; set; }
    public string type { get; set; }
    public string minecraftArguments { get; set; }
    public int minimumLauncherVersion { get; set; }
    public string assets { get; set; }
    public List<Library> libraries { get; set; }
    public string mainClass { get; set; }
}

完成后,我可以使用以下代码下载和反序列化JSON:

        var url = @"http://s3.amazonaws.com/Minecraft.Download/versions/1.7.10/1.7.10.json";

        RootObject root;

        using (var wc = new System.Net.WebClient())
        using (var stream = wc.OpenRead(url))
        using (var textReader = new StreamReader(stream))
        using (var reader = new JsonTextReader(textReader))
        {
            root = JsonSerializer.CreateDefault().Deserialize<RootObject>(reader);
        }