2016-05-29 15 views
0

Ich versuche, dieses JSON-Dokument zu analysieren:Parse JSON mit Vala

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

Dies ist, was ich gemacht:

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

Es problemlos kompilieren, aber wenn ich das Mittagessen das Programm I habe diese Fehler:

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

Warum? Eine andere Frage, warum ist es so schwer, einen JSON mit einer Mittelsprache, Vala, zu lesen? Es sollte viel einfacher sein!

+0

Sie müssen keinen 'DataInputStream' verwenden, Sie können einfach' file.load_contents() 'aufrufen. –

+0

Sie können auch 'Json.from_string()' verwenden, wenn Sie kürzlich ein 'valac'- und ein' json-glib-1.0'-Paket installiert haben. Es speichert auch einige LOCs. –

Antwort

2

Das Problem besteht darin, dass Sie Ihre nulllösbare Res-Zeichenfolge als null initialisieren.

Wenn Sie dann etwas zur Zeichenfolge hinzufügen, bleibt es null.

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

können Sie entweder initialisieren es als "" (leere Zeichenkette und in diesem Fall kann man einfach eine nicht nullable String als auch verwenden) oder Sie können die DataInputStream alltogether überspringen und file.load_contents() verwenden.

+1

Oder Sie können 'Json.Parser.load_from_stream()' verwenden. – ebassi

+0

Danke Jens, du hast mein Problem behoben! – Wizix

+0

Hey Jens, hast du einen Link/Ressourcen um mir zu helfen zu verstehen, wie man mit JSON in Vala arbeitet? Danke – omukiguy