2016-11-16 2 views
-3

Я хочу написать все имена каждой библиотеки в textBox1 из файла .json. До сих пор у меня есть этот код:Json.NET Deserializing 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 в 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. Как эта структура связана с объектом 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 объектов ,

+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; } 
Смежные вопросы