Json.NET 反序列化系统.NullReferenceException.



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

您的类定义和您请求的数据之间似乎可能存在结构冲突。例如,您的类是这样定义的:

    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; }

我认为您的问题与File.ReadAllText有关。此方法的语法如下:

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);

但是,即使此更改也无法解决您的问题!请仔细查看该文件,如果我们请求您提到的网址,则会提供该文件。此结构如何与具有名为 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对象。

最新更新