2016-01-23 69 views
0

這將是一個很多事情要解釋,所以我提前道歉,如果我不解釋我在找什麼足夠徹底,如果你需要我澄清任何東西只是問,我會盡我所能。閱讀json文件並根據文件數據下載文件

所以我在C#中製作了一個Minecraft啓動器,並且我已經到了需要下載資源的部分,在資產文件夾中有兩個文件夾索引和對象,現在我將關注索引文件夾。我已經有了啓動器從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/(散列的前兩個十六進制字符)/(整個散列)以下載與所述散列關聯的文件。希望這個例子會使它更加清晰:

在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的文件夾。一旦文件夾在之前提到的對象文件夾中創建,它將需要轉到前面提到的鏈接(我不能再次發佈它在這個因爲我有不到10個聲望,不能發佈超過2個鏈接,但它是鏈接,有resource.download.minecraft不是s3.amazonaws鏈接)

將與所述散列相關聯的文件下載到名爲72的文件夾。 您很可能會看到因下載相關文件而導致的「(散列的前2個十六進制字符)/(整個散列)」部分的URL使用散列需要採用has的前兩個字符,在這種情況下,它是72,然後添加一個/ then以及將下載該文件的整個散列。你可能也會想,我可以把鏈接放在代碼中,而不必閱讀json,但我實際上需要讓它讀取.json文件,因爲它需要與多個版本的.json一起工作(IE:1.7.10 .json,1.8.json等)。 感謝您的幫助提前。

+0

在stackoverflow上, 「鏈式」問題的修正格式是[每個問題一個問題](http://meta.stackexchange.com/questions/39223/one-post-with-multiple-questions-or-multiple-posts)。你有什麼辦法可以把它分解成更多的原子問題嗎? – dbc

回答

0

包含自定義更新

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"串成爲字典鍵。

原來的答案

我上傳的JSON目前在你的鏈接http://s3.amazonaws.com/Minecraft.Download/versions/1.7.10/1.7.10.jsonhttp://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); 
     } 
+0

我甚至沒有意識到我有錯誤的鏈接,謝謝指出,它應該現在修復。我也會嘗試你的建議,並回復你,並接受答案,如果它的工作,再次感謝。 – Jamriz21

+0

@ Jamriz21 - 答案已更新。 – dbc

+0

請原諒我對Json.net的工作無知,因爲我對它很陌生,但我無法嘗試使用您提供的代碼。我似乎無法從文件中得到散列,我知道我沒有在問題中提到這個問題,但是例如我將如何使用Console.WriteLine將散列打印到控制檯窗口。感謝幫助。 – Jamriz21