2016-07-16 8 views
3

Ich habe dieses JSON und ich habe es deserialisieren:C# deserialize Json unbekannter Schlüssel

{ 
    "homepage": "http://files.minecraftforge.net/maven/net/minecraftforge/forge/", 
    "promos": { 
    "1.10-latest": "12.18.0.2000", 
    "1.10.2-latest": "12.18.1.2014", 
    "1.10.2-recommended": "12.18.1.2011", 
    "1.5.2-latest": "7.8.1.738", 
    "1.5.2-recommended": "7.8.1.737", 
    "1.6.1-latest": "8.9.0.775", 
    "1.6.2-latest": "9.10.1.871", 
    "1.6.2-recommended": "9.10.1.871", 
    "1.6.3-latest": "9.11.0.878", 
    "1.6.4-latest": "9.11.1.1345", 
    "1.6.4-recommended": "9.11.1.1345", 
    "1.7.10-latest": "10.13.4.1614", 
    "1.7.10-latest-1.7.10": "10.13.2.1343", 
    "1.7.10-recommended": "10.13.4.1558", 
    "1.7.2-latest": "10.12.2.1147", 
    "1.7.2-recommended": "10.12.2.1121", 
    "1.8-latest": "11.14.4.1577", 
    "1.8-recommended": "11.14.4.1563", 
    "1.8.8-latest": "11.15.0.1655", 
    "1.8.9-latest": "11.15.1.1902", 
    "1.8.9-recommended": "11.15.1.1722", 
    "1.9-latest": "12.16.0.1942", 
    "1.9-recommended": "12.16.1.1887", 
    "1.9.4-latest": "12.17.0.1990", 
    "1.9.4-recommended": "12.17.0.1976", 
    "latest": "12.18.1.2014", 
    "latest-1.7.10": "10.13.2.1343", 
    "recommended": "12.18.1.2011" 
    } 
} 

auf dieser Website Suche viel, kam ich mit diesem Code aus:

dynamic json = JsonConvert.DeserializeObject<Dictionary<string, string>>(data); 
foreach (KeyValuePair<string, string> entry in json["promos"]) 
{ 
    MessageBox.Show(entry.Key); 
    MessageBox.Show(entry.Value); 
} 

Ich muß Holen Sie beide Schlüssel und Wert von diesem Json, aber mit diesem Code sagt es gibt ein unerwartetes Zeichen in Zeile 3 pos 13. Ich versuchte auf viele verschiedene Arten, aber ich kann nicht Wert und Schlüssel zur gleichen Zeit erhalten. Mit etwas Code bekam ich nur den Schlüssel und mit etwas anderem Code bekam ich nur den Wert. Kannst du mir erklären, wie man sowohl Wert als auch Schlüssel erhält?

Antwort

2

Sie direkt die json als JObject analysieren kann und der Knoten „Promos“ umwandeln Wörterbuch

var json = JObject.Parse(data); 
var promos = json["promos"].ToObject<Dictionary<string, string>>(); 
foreach (var entry in promos) 
{ 
    MessageBox.Show(entry.Key); 
    MessageBox.Show(entry.Value); 
} 
+0

Das funktioniert perfekt! Wirklich danke dir! – ThePHPAddicted

0

Das Problem ist der Typ, in dem Sie versuchen, zu deserialisieren. Sie versuchen, es als Dictionary zu deserialisieren, aber während der erste Eintrag ein Stringpaar ist, ist Promos ein Dictionary selbst, daher können Sie den Wert von "promos" nicht in einen String umwandeln! Gesetzt Ihre json ist in einer Datei namens „json.json“ Sie ein Wörterbuch von Iterieren durch Promos JObject erhalten können und werfen Sie die Elemente zu einem JProperty, auf diese Weise erhalten:

var json = File.ReadAllText("json.json"); 
var deserialized = JsonConvert.DeserializeObject<JObject>(json); 

var dictionary = new Dictionary<string, string>(); 

foreach (JProperty item in deserialized["promos"]) 
    dictionary.Add(item.Name, item.Value.ToString()); 
0

Ihre Daten sind kein Dictionary<string, string>, weil der Wert von promos kein string aber ein Wörterbuch ist.

Sie könnten zu einem JObject deserialize und dann den Wert Ihrer promos Eigenschaft erhalten.

JObject json = JsonConvert.DeserializeObject<JObject>(data); 
//var promos = json.Value<Dictionary<string, string>>("promos"); 
var promos = data["promos"].ToObject<Dictionary<string, string>>(); 
foreach (KeyValuePair<string, string> entry in promos) { 
    //do some stuff 
} 

EDIT

Nicht sicher, warum die ursprüngliche Art und Weise nicht funktioniert und nicht die Zeit jetzt untersuchen müssen, aber die zweite Zeile sollte es tun.

+0

Es sagt System.InvalidCastException: nicht in newtonsoft.json.linq.jtoken werfen newtonsoft.json.linq.jobject Kann . Was heißt das? Wie kann ich es lösen? – ThePHPAddicted