2016-05-29 8 views
0

Я пытаюсь разобрать этот JSON документ:Анализировать JSON с Валом

{ 
    "registration" : "F-FBZH", 
    "model" : "DR400-120" 
} 

Это то, что я сделал:

public Plane load_airplane (string registration) { 
    try { 
     string? res = null; 
     var file = File.new_for_path (location + registration + ".json"); 

     if (file.query_exists()) { 
      var dis = new DataInputStream (file.read()); 
      string line; 

      while ((line = dis.read_line (null)) != null) { 
       res += line; 
      } 

      var parser = new Json.Parser(); 
      parser.load_from_data (res); 
      var root_object = parser.get_root().get_object(); 

      string data_registration = root_object.get_string_member ("registration"); 
      string data_model = root_object.get_string_member ("model"); 

      return new Plane (data_registration, data_model); 
     } 
    } catch (Error e) { 
     stderr.printf ("%s\n", e.message); 
    } 
    return new Plane.default(); 
} 

Он компилируется без каких-либо проблем, но когда я обед программы I были получены следующие ошибки:

(process:25868): Json-CRITICAL **: json_parser_load_from_data: assertion 'data != NULL' failed 

(process:25868): Json-CRITICAL **: json_node_get_object: assertion 'JSON_NODE_IS_VALID (node)' failed 

(process:25868): Json-CRITICAL **: json_object_get_string_member: assertion 'object != NULL' failed 

(process:25868): Json-CRITICAL **: json_object_get_string_member: assertion 'object != NULL' failed 

** (process:25868): CRITICAL **: open_plane_plane_construct: assertion 'registration != NULL' failed 

** (process:25868): CRITICAL **: open_plane_plane_get_registration: assertion 'self != NULL' failed 
(null) 

Почему? Другой вопрос, почему трудно читать JSON со средним языком, Вала? Это должно быть намного проще!

+0

Вам не нужно использовать 'DataInputStream', вы можете просто вызвать' file.load_contents() '. –

+0

Вы также можете использовать 'Json.from_string()', если у вас установлены последние пакеты 'valac' и' json-glib-1.0'. Это также сэкономит вам некоторые LOC. –

ответ

2

Проблема в том, что вы инициализируете свою нулевую строку res как null.

Если вы затем добавите что-то в строку, оно останется равным нулю.

string? res = null; 
res += "something"; 
// res will still be null here! 

Вы можете инициализировать его как "" (пустую строку и в этом случае вы можете просто использовать не обнуляемую строку, а), или вы можете пропустить DataInputStream отбрасывается, использовать file.load_contents().

+1

Или вы можете использовать 'Json.Parser.load_from_stream()'. – ebassi

+0

Спасибо, Дженс, ты исправил мою проблему! – Wizix

+0

Эй, Дженс, у вас есть связь/ресурсы, которые помогут мне понять, как работать с JSON в vala? Спасибо – omukiguy