2016-11-16 146 views
-3

我想從.json文件中寫入textBox1中每個庫的所有名稱。到目前爲止,我有這樣的代碼:Json.NET反序列化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; } } 

它沒有錯誤,但是當我運行它時,錯誤是System.NullReferenceException。你能告訴我我做錯了什麼嗎?

+0

在哪一行拋出異常? – Bigeyes

+0

我不想一般的回答,我有Google。我花了4個小時弄清楚我做錯了什麼,我仍然沒有得到它,如果你知道如何,請幫助我。 – rysroma

+0

@Bigeyes var item in libs.name – rysroma

回答

0

我認爲你的問題與File.ReadAllText有關。這種方法的syntax如下:

public static string ReadAllText(string path) 

我懷疑1.8.8.json是路徑。

您可以嘗試使用以下命令:

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

然而,即使這種變化不會解決您的問題!請仔細看看這個文件,如果我們請求你提到的url,這個文件就會被提供。這個結構如何與一個名爲name的JSON對象相關聯?

此外,即使您解決這個問題,以下是什麼?

libs,如果一切順利的話,是類Library的一個實例。它不是IEnumerable<T>,爲了遍歷它。

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

這本來是有道理的,如果你有類似以下內容:

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

換句話說,如果在指定的路徑中的文件的解析後,你有Library對象序列。

+0

這不是,textBox1.Text = File.ReadAllText(「1.8.8.json」);將以JSON格式返回正確的文本。但是,這是最好的,我可以從你在你的問題中得到的。 libs返回null不知道爲什麼。 – rysroma

+0

@rysroma你測試過了嗎?給定方法的簽名,我不明白這怎麼可能是真的。 – Christos

0

看起來你可能在你的類定義和你正在請求的數據之間有結構衝突。例如,您的類是這樣定義的:

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

這意味着每個庫都有一個包含其名稱的單個字符串變量。到現在爲止還挺好。但是,當您嘗試反序列化JSON,好像你正在尋找圖書館類對象的數組:

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

因此,當將JSON解串器試圖反序列化的Library數組或Library[],它未能執行映射,並返回一個空值。當執行的下一行,libs爲空,所以是name,你得到的NullReferenceException:

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

此外,您foreach循環實際上是不是想從一個Library到旁邊去,而是通過每個字符的名字都是Library。你應該這樣寫你的代碼:

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