【问题标题】:how to convert map<anydata> to json如何将 map<anydata> 转换为 json
【发布时间】:2019-08-19 12:38:34
【问题描述】:

在我的 CRUD 休息服务中,我插入数据库并希望用创建的新记录响应调用者。我正在寻找一种将地图转换为 json 的好方法。

我在 ballerina 0.991.0 上运行并使用 postgreSQL。

更新(“INSERT ...”)的返回是一个映射。 我尝试使用转换和邮票,但我没有为我工作。

import ballerinax/jdbc;

...

jdbc:Client certificateDB = new({
    url: "jdbc:postgresql://localhost:5432/certificatedb",
    username: "USER",
    password: "PASS",
    poolOptions: { maximumPoolSize: 5 },
    dbOptions: { useSSL: false }
}); ...

var ret = certificateDB->update("INSERT INTO certificates(certificate, typ, scope_) VALUES (?, ?, ?)", certificate, typ, scope_);

// here is the data, it is map<anydata> 
ret.generatedKeys 

map应该知道它是哪种数据类型吧?
那么应该很容易将它转换为这样的json:

{"certificate":"{certificate:
"-----BEGIN
CERTIFICATE-----\nMIIFJjCCA...tox36A7HFmlYDQ1ozh+tLI=\n-----END
CERTIFICATE-----", typ: "mqttCertificate", scope_: "QARC", id_:
223}"}

现在我做一个 foreach 并手动构建 json。相当丑陋。也许有人有一些技巧可以很好地做到这一点。 不能排除是因为我缺乏编程技能:-)

【问题讨论】:

    标签: type-conversion ballerina


    【解决方案1】:

    JDBC远程更新函数的返回值为sql:UpdateResult|error。

    sql:UpdateResult 是一个包含两个字段的记录。 (参考https://ballerina.io/learn/api-docs/ballerina/sql.html#UpdateResult

    1. Int 类型的UpdatedRowCount - 由于给定语句执行而受到影响/更新的行数
    2. generatedKeys of type map - 这包含由于更新操作而自动生成的列值的映射(仅当相应的表具有自动生成的列时)。数据以列名和列值的键值对形式给出。所以这个地图只包含自动生成的列值。

    但您的要求是获取给定更新函数插入的整行。如果 self.update 操作不能返回它。为此,您必须使用匹配条件执行 jdbc 选择操作。选择操作将返回一个表或错误。该表可以使用 convert() 函数轻松转换为 json。

    例如:假设证书表有一个自动生成的主键列名称“cert_id”。然后您可以使用以下代码检索该 id 值。

    int generatedID = <int>updateRet.generatedKeys.CERT_ID;
    

    然后使用生成的 id 来查询数据。

    var ret = certificateDB->select(“SELECT certificate, typ, scope_ FROM certificates where id = ?”, (), generatedID);
    json convertedJson = {};
    if (ret is table<record {}>) {
        var jsonConversionResult = json.convert(ret);
        if (jsonConversionResult is json) {
            convertedJson = jsonConversionResult;
        }
    }
    

    更多详情请参考示例https://ballerina.io/learn/by-example/jdbc-client-crud-operations.html。?

    【讨论】:

    • 您好 Anupama,感谢您的快速响应。这会奏效。我有那个自动生成的主键。当所有信息都已经在 INSERT(更新)的响应中时,我不想对数据库进行额外的 SQL 调用(选择)。
    • 既然您已经知道要插入的数据,那么您只需要自动生成的主键即可。它将从更新函数返回(在 generatedKeys 字段中)。通过发出第二个 select 函数调用,您将获得相同的信息。由于您已经拥有所需的数据,因此您可以在从更新返回值获取自动生成的 Id 后手动创建 json。您可以在芭蕾舞演员地图中维护所有数据,然后轻松将其转换为 json。有关 map 到 json 转换的更多详细信息,请参阅 ballerina.io/learn/by-example/json-record-map-conversion.html
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2019-05-31
    • 1970-01-01
    • 2015-03-12
    • 2022-01-08
    相关资源
    最近更新 更多