使用Vala解析JSON

3

我正在尝试解析这个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 ();
}

代码编译没有问题,但是当我运行程序时出现了以下错误:

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

为什么?又是一个问题,为什么使用中级语言Vala读取JSON这么难?这应该会更容易才对!


你不必使用 DataInputStream,你可以直接调用 file.load_contents() - Jens Mühlenhoff
如果您已安装了最新的valacjson-glib-1.0软件包,也可以使用Json.from_string()。这样做还可以节省一些代码行。 - Jens Mühlenhoff
1个回答

4
问题在于你将可空的 res 字符串初始化为 null。
如果你向字符串中添加内容,它仍将保持为 null。
string? res = null;
res += "something";
// res will still be null here!

你可以将其初始化为 ""(空字符串,此情况下也可以使用非空字符串),或者您可以完全跳过 DataInputStream 并使用 file.load_contents ()

1
或者您可以使用 Json.Parser.load_from_stream() - ebassi
谢谢Jens,你解决了我的问题! - Louis Etienne
嗨Jens,你有没有链接或资源可以帮助我了解如何在Vala中使用JSON?谢谢。 - omukiguy
我会建议先阅读 json-glib 的 API 文档 @ valadoc: https://valadoc.org/json-glib-1.0/Json.Parser.html#! - Jens Mühlenhoff
当然,还有原始的C API参考手册:https://developer.gnome.org/json-glib/unstable/ - Jens Mühlenhoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接