2016-11-16 5 views
-3

Ich möchte alle Namen jeder Bibliothek in TextBox1 aus einer .json-Datei schreiben. Bisher habe ich diesen Code:Json.NET Deserializing System.NullReferenceException

client.DownloadFile("https://s3.amazonaws.com/Minecraft.Download/versions/1.8.8/1.8.8.json", "1.8.8.json"); 
Library libs = JsonConvert.DeserializeObject<Library>(File.ReadAllText("1.8.8.json")); 
foreach (var item in libs.name) { textBox1.Text += item; } 
public class Library { public string name { get; set; } } 

Es keine Fehler macht, aber wenn ich es laufen der Fehler System.NullReferenceException. Kannst du mir bitte sagen, was mache ich falsch?

+0

In welcher Zeile wird die Ausnahme ausgelöst? – Bigeyes

+0

Ich möchte keine allgemeine Antwort, ich habe Google. Ich habe 4 Stunden damit verbracht herauszufinden, was ich falsch mache und ich verstehe es immer noch nicht, bitte hilf mir, wenn du weißt wie. – rysroma

+0

@Bigeyes var Element in libs.name – rysroma

Antwort

0

Ich denke, Ihr Problem ist mit der File.ReadAllText verbunden. Die syntax dieser Methode ist die folgende:

public static string ReadAllText(string path) 

I bezweifeln, dass 1.8.8.json ein Weg ist.

Sie könnten versuchen, die folgenden zu verwenden:

var path = Path.Combine(Application.StartupPath,"1.8.8.json"); 
var libs = JsonConvert.DeserializeObject<Library>File.ReadAllText(path); 

Doch selbst diese Änderung Ihr Problem nicht lösen! Bitte schauen Sie sich die Datei genau an, die geliefert wird, wenn wir die von Ihnen erwähnte URL anfordern. Wie ist diese Struktur mit einem JSON-Objekt verknüpft, das eine Eigenschaft namens name hat?

Darüber hinaus, auch wenn Sie dies beheben, was ist das Folgende?

Die libs, wenn alles gut geht, ist eine Instanz der Klasse Library. Es ist kein IEnumerable<T>, um es zu durchlaufen.

foreach (var item in libs.name) { textBox1.Text += item; } 

hat Sinn Dies wäre gemacht, wenn Sie so etwas wie die folgende haben:

var libs = JsonConvert.DeserializeObject<IEnumerable<Library>>File.ReadAllText(path); 

Mit anderen Worten, wenn nach dem Parsen der Datei in dem angegebenen Pfad Sie eine Folge von Library Objekten haben .

+0

Es ist nicht, TextBox1.Text = File.ReadAllText ("1.8.8.json"); wird den richtigen Text im JSON-Format zurückgeben Die Bibliotheken kehren zurück null weiß nicht warum – rysroma

+0

@rysroma Haben Sie das getestet? Ich sehe nicht, wie das wahr sein kann, angesichts der Signatur der Methode. – Christos

0

Sie haben möglicherweise einen strukturellen Konflikt zwischen Ihrer Klassendefinition und den von Ihnen angeforderten Daten. Zum Beispiel wird die Klasse auf diese Weise definiert:

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

Das bedeutet, dass jede Bibliothek ein einzelnes String-Variable enthält seinen Namen hat. So weit, ist es gut. Aber dann, wenn Sie versuchen, die Json deserialisieren, scheint es, wie Sie für eine Reihe von Bibliotheksklassenobjekte suchen:

Library libs = JsonConvert.DeserializeObject<Library>(File.ReadAllText("1.8.8.json")); 

Also, wenn die Json Deserializer versucht, eine Reihe von Library zu deserialisieren oder Library[], es führt das Mapping nicht durch und gibt einen Nullwert zurück. Wenn die nächste Zeile ausgeführt wird, ist libs null, und so ist name, und Sie erhalten die Nullreferenceexception:

foreach (var item in libs.name) { textBox1.Text += item; } 

Weiterhin Ihre foreach Schleife versucht, tatsächlich nicht von einem Library zum nächsten zu gehen, sondern durch jedes Zeichen des Namens Library. Sie sollten Ihren Code mehr wie folgt schreiben:

Library[] libs = JsonConvert.DeserializeObject<Library[]>(File.ReadAllText("1.8.8.json")); 
foreach (Library lib in libs) {textBox1.Text += lib.name; } 
Verwandte Themen