linux JSON序列化-修改结果属性名称

xggvc2p6  于 2023-06-21  发布在  Linux
关注(0)|答案(1)|浏览(134)

我正在尝试使用这个库来序列化我编写的类。Valadoc : gobject_to_data
假设我有一个这样写的类:

public class MyObject : Object {
    public string property_name { get; set; }

    public MyObject (string str) {
        this.property_name = property_name;
    }
}

public static int main (string[] args) {
    MyObject obj = new MyObject ("my string");

    string data = Json.gobject_to_data (obj, null);
    print (data);
    print ("\n");

    return 0;
}

我看到的输出是:

{
  "property-name" : "my string"
}

我想做的是修改属性名称,而不是在“蛇的情况下”:

{
  "property_name" : "my string"
}

我该怎么做?
我试着从Serializable接口实现serialize_property,如下所示:

public class MyObject : Object : Json.Serializable {
     public string property_name { get; set; }

     public MyObject (string str) {
    this.property_name = property_name;
     }

     public Json.Node serialize_property(string property_name, Value value, ParamSpec pspec) {
        string property_name_camel_case = property_name.replace("-", "_");

        Json.Node value_node = new Json.Node(Json.NodeType.VALUE);
        value_node.set_value(value);

        Json.Object final_object = new Json.Object();
        final_object.set_member(property_name_camel_case, value_node);

        return value_node;
    }
}

public static int main (string[] args) {
    MyObject obj = new MyObject ("my string");

    string data = Json.gobject_to_data (obj, null);
    print (data);
    print ("\n");

    return 0;
}

但是,我仍然收到这样的输出:

{
  "property-name" : "my string"
}
pzfprimi

pzfprimi1#

如果其他人正在寻找这个答案

遗憾的是,JSON序列化不支持非规范名称see here。在实现Json.Serializable.list_properties时,仍然不能创建任何具有非规范名称的ParamSpec
因此,我不得不构建一个Json.Object,并手动设置每个键值对,如下所示:

public string to_json() {
        // None of these names are canonical, so we have to write them manually
        Json.Object main_object = new Json.Object();
        main_object.set_string_member("@type", "setTdlibParameters");
        main_object.set_string_member("database_directory", database_directory);
        main_object.set_boolean_member("enable_storage_optimizer", enable_storage_optimizer);

        Json.Node wrapper = new Json.Node(Json.NodeType.OBJECT);
        wrapper.set_object(main_object);

        Json.Generator generator = new Json.Generator();
        generator.set_root(wrapper);

        return generator.to_data(null);
    }

相关问题