2016-06-26 10 views
0

私は現在、ミニクラフトの既存のランチャーを使用していくつかの問題を解決するための小さなランチャーを作成しようとしています。 私は必要なすべての情報を得るために.jsonファイルを読み込もうとしています。 .jsonファイルhereを参照する必要がある場合。json foreachループ(json.netなし)

私はちょうどこれで

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 

が、明らかに私は、foreachループを必要とし、「パス」と「URL」のための1つのエントリ、より多くのがあります: 「要素」になります。 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

なぜあなたはJSONライブラリを使用したくありませんか?あなたはそれらを使用して2分で終了します –

+0

@SirRufo .netで.jsonファイルを扱う多くの方法がありますが、私が使用しているものは1つだけです。私は本当にあなたが望むものを得るために第三者の図書館を使う必要性を見ていません。私はサードパーティのライブラリなしで.jsonをループする方法もたくさんあると確信しています。私は現在、どうやってどうやっているのか分かりません。 – Backslash

+0

確かにたくさんの方法がありますし、子供用のシャベルで家を建てることもできます。私は、仕事を行うための正しいツールを使用することをお勧めします。 Json.NETを使用すると、2分で作業が完了します。ちょうど私の2セント –

答えて

0

問題あなたのJSONに配列が含まれ、JsonReaderWriterFactoryは、XML要素に配列をマッピングする方法、それはすぐに明らかではないということですXMLには配列の概念がないことを考えると、

これを特定する方法の1つは、このマッピングを説明するドキュメントMapping Between JSON and XMLを読むことです。しかし、もう一つは、単に各自のために、Get the XPath to an XElement?の答えの1つを使って各要素の実際の経路を調べることです。 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>ノードに配置されます。次のように

したがって、あなたのパスと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; } 
}