我想从.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。你能告诉我我做错了什么吗?
答案 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反序列化程序试图反序列化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; }
名称的每个字符。您应该更像这样编写代码:
<div class="btn-group" role="group">|</div>