2016-11-16 145 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; }