2016-07-11 6 views
0

Ich versuche, eine JSON-Datei mit Json.net zu analysieren. Der Inhalt der JSON-Datei ist:Parse JSON-Datei ohne Schlüsselwerte

[ 
    [ "240521000", "37.46272", "25.32613", "0", "71", "90", "15", "2016-07-18T21:09:00" ], 
    [ "237485000", "37.50118", "25.23968", "177", "211", "273", "8", "2015-09-18T21:08:00" ] 
] 

ich den folgenden Code erstellt:

WebClient wc = new WebClient(); 
    string json = wc.DownloadString("data.json"); 
    dynamic myObject = JsonConvert.DeserializeObject<dynamic>(json); 

    foreach (string item in myObject[0]) 
    { 
     var x = item[0]; 

    } 

Wie kann ich eine Schleife durch alle einzelnen Elemente, ohne einen Schlüssel zu haben?

+0

Ist der von Ihnen gepostete JSON korrekt? Es zeigt ein zweidimensionales Array ([] []), aber der Inhalt des verschachtelten Arrays sieht aus, als sollte es stattdessen ein Objekt sein - normalerweise wird es stattdessen von {} notiert. – mtaanquist

+0

@MadsTaanquist Die Json kommt aus: http://www.marinetraffic.com/nl/ais-api-services/documentation/api-service:27 –

Antwort

1

Während DiN_ Antwort die Frage beantwortet, glaube ich nicht, dass es eine gute Lösung ist. Nach einem Blick auf die Marine Traffic API fühlt es sich an, als hätten sie eine schlechte JSON-Implementierung vorgenommen, da die XML-Darstellung eindeutig Attributnamen für die Werte aufweist. Ihre JSON sollte haben gewesen:

{"positions": ["position": {"mmsi": "311029000", "lat": "37.48617", "long": "24.37233", ...}]} 

Weil es nicht der Fall ist, haben wir einen JSON-String statt, wo es eine verschachtelte Array, wobei das Array ein zweidimensionales Feld, und man müsste die Hoffnung Das Datenmodell wird nicht geändert, um etwas zu entfernen, da Sie zum Abrufen von Daten einen Index verwenden müssen.

Wenn Sie jedoch die von der API verfügbare XML betrachten, haben die Attribute Namen. Ich würde vorschlagen, dass Sie stattdessen das XML herunterladen und dieses in ein Objekt - ein Modell in ASP.NET - einbetten, das stark typisiert ist und einfacher in einer Ansicht verwendet werden kann.

Hier ist ein Beispiel, das ich ausgeführt habe. Es verwendet XML-Parsing, um zuerst das XML von der API zu lesen und es dann zu JSON und schließlich zu einem tatsächlichen Objekt zu analysieren.

Zuerst wird die Modellklasse (Position.cs)

public sealed class Position 
{ 
    [JsonProperty("@MMSI")] 
    public string MMSI { get; set; } 
    [JsonProperty("@LAT")] 
    public string Latitude { get; set; } 
    [JsonProperty("@LON")] 
    public string Longitude { get; set; } 
    [JsonProperty("@SPEED")] 
    public string Speed { get; set; } 
    [JsonProperty("@HEADING")] 
    public string Heading { get; set; } 
    [JsonProperty("@COURSE")] 
    public string Course { get; set; } 
    [JsonProperty("@STATUS")] 
    public string Status { get; set; } 
    [JsonProperty("@TIMESTAMP")] 
    public string TimeStamp { get; set; } 
} 

Als nächstes werden die Parsing-Logik:

var client = new WebClient(); 
var xml = client.DownloadString("data.xml"); 
var doc = new XmlDocument(); 
doc.LoadXml(xml); 

var json = JsonConvert.SerializeXmlNode(doc); 
var positions = JObject.Parse(json).SelectToken("pos").SelectToken("row").ToObject<List<Position>>(); 

Am Ende der Parsing-Logik, haben Sie jetzt eine Liste von Positionen, die Sie zu Ihrer Ansicht weitergeben können, und müssen stark typisiert sein.

Als kurzes Beispiel:

// after you have the positions list 
return View(positions); 

Positions.cshtml

@model List<Positions> 

<h2>Positions</h2> 
@foreach (var position in Model) 
{ 
    <p>@position.MMSI (@position.Latitude, @position.Longitude)</p> 
} 

Ich hoffe, dies ist nützlich für Sie. Wenn Sie Fragen haben, schreiben Sie mir einen Kommentar.

+0

Danke für diese großartige Erklärung! –

3

Sie brauchen wahrscheinlich nur zwei verschachtelte foreach Anweisungen. Versuchen Sie etwas wie das: