Json.NET反序列化System.NullReferenceException

时间:2016-11-16 21:37:34

标签: c# json

我想从.json文件中编写textBox1中每个库的所有名称。到目前为止,我有这段代码:

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。你能告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分: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);

然而,即使这种改变也无法解决您的问题!请仔细查看该文件,如果我们请求您提到的网址,则会提供该文件。此结构如何与JSON对象关联,该对象具有名为name

的属性

此外,即使您解决了这个问题,以下内容是什么?

如果一切顺利的话,libs是类Library的一个实例。它不是IEnumerable<T>,以便迭代它。

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

如果您有类似以下内容的话,这将是有道理的:

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

换句话说,如果在指定路径中解析文件后,您有一系列Library个对象。

答案 1 :(得分:0)

您的类定义与请求的数据之间似乎存在结构性冲突。例如,您的类以这种方式定义:

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

这意味着每个库都有一个包含其名称的字符串变量。到现在为止还挺好。但是,当您尝试反序列化Json时,您似乎正在寻找一个Library类对象数组:

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

因此,当Json反序列化程序试图反序列化LibraryLibrary[]的数组时,它无法执行映射,并返回空值。执行下一行时,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; } 名称的每个字符。您应该更像这样编写代码:

<div class="btn-group" role="group">|</div>