2014-11-01 7 views
2

Пытается получить всю информацию из json-файла в массив с C#, используя только Newtonsoft.Json.JSON to Array C#

namespace tslife 
    { 
     partial class game 
     {   

     world[] game_intro = _read_world<world>("intro"); 

     //** other code **// 

     public void update() 
     { 
      //crashes: System.NullReferenceException: Object reference not set to an instance of an object 
      Console.WriteLine(game_intro[0].data.Text);   
     } 

     private static T[] _read_world<T>(string level) 
     {   
      var json_data = string.Empty; 
      string st = ""; 
      try 
      { 
       var stream = File.OpenText("Application/story/"+level+".json"); 
       //Read the file    
       st = stream.ReadToEnd(); 
      } 
      catch(SystemException e){} 
      json_data = st; 

      //Console.WriteLine(json_data); 
      // if string with JSON data is not empty, deserialize it to class and return its instance 
      T[] dataObject = JsonConvert.DeserializeObject<T[]>(json_data); 
      return dataObject; 
     } 
    } 
} 


    public class worldData { 
    public string Text { get; set; } 
    public string Icon { get; set; } 
    public int sectionID { get; set; } 
} 

public class world 
{ 
    public worldData data; 
} 

Я не знаю, является ли это форматирование json, но я застрял после поиска в другом месте.

[{ 
    "world": 
     { 
      "Text":"Hi", 
      "Icon":"image01.png", 
      "sectionID": 0 
     } 
}, 
{ 
    "world": 
     { 
      "Text":"Hey", 
      "Icon":"image02.png", 
      "sectionID": 1 
     } 
} 
] 
+0

вы можете попробовать заменить «общедоступные данные WorldData» на 'public worldData world {get; set;} 'и сообщить нам, что происходит? – rene

+0

Я изначально имел это, все еще не работал. –

+0

Вы получаете пустой массив, не так ли? Можете ли вы избавиться от этого пустого улова, пожалуйста? – rene

ответ

0

В сериализации и десериализации без аннотации элементы-члены должны соответствовать вашей структуре JSON.

Класс world и worldData OK-ish, но в мировом классе отсутствует свойство world.

Если изменить структуру класса это:

public class worldData { 
    public string Text { get; set; } 
    public string Icon { get; set; } 
    public int sectionID { get; set; } 
} 

// notice I had to change your classname 
// because membernames cannot be the same as their typename 
public class worldroot 
{ 
     public worldData world { get; set; } 
} 

Я десериализации ваш JSON в массив whicjh дает мне два элемента:

var l = JsonConvert.DeserializeObject<worldroot[]>(json); 

А на отлов исключений: Только улов если вы собираетесь делать с ними что-то разумное.

 try 
     { 
      var stream = File.OpenText("Application/story/"+level+".json"); 
      //Read the file    
      st = stream.ReadToEnd(); 
     } 
     catch(SystemException e){} 

Пустые уловы, подобные этим, бесполезны и только препятствуют в отладке. Ты можешь жить с unchecked exceptions.

+0

Спасибо, поэтому переменная должна быть такой же, как переменная Json. Полезно знать сейчас. Я просто изменил класс на мир, поскольку он нужен только при инициализации. –