如何使用 Ballerina 将记录类型转换为字符串?

How to convert a Record type to string in-line with Ballerina?

我有一个芭蕾舞演员 record 类型如下。

type Flight record {
    int flightNo;
    string airline;
    int price;
    !...
};

我想在一行中将其转换为字符串。在下面尝试但给出了编译错误。

log:printDebug("Response : " + check <string> <json> flight but {error => {}});

在上面,Flightjson 错误是使用 but 处理的。 jsonstring 错误被检查省略。但它仍然给出以下错误。

incompatible types: 'json|error' cannot be converted to 'string'

芭蕾舞女演员似乎没有把 <json> flight but {error => {}} 作为一个整体 returns 只有一个 json 但是 <json> flight 其中 returns 或者 jsonerror。如果这是 Java,我可以简单地用括号 check <string> (<json> flight but {error => {}}) 将它们括起来。但是,这似乎也不起作用。

我的问题是,我已经尝试过的失败是否合乎逻辑(公平)?我们可以在线执行此操作吗?

在 ballerina 中,如果您想将 json 转换为 string,则必须在 json 变量上使用内置的 toString() 函数。

因此,如果您的要求是先将记录转换为 json,然后再转换为 string,则以下示例代码会有所帮助。如果你想直接convert/format一个recordstring,那么你可以使用第二种情况下给出的sprintf函数,它可以将给定的记录格式化为字符串。

import ballerina/io;
type Flight record {
    int flightNo;
    string airline;
    int price;
    !...
};

public function main(string... args) {
    Flight flight = {flightNo:1234, airline:"SL", price:54321};

    // record to json and then to string
    json j = check <json> flight;
    string jStr = j.toString();
    io:println(jStr);

    // record to string
    string rStr = io:sprintf("%s", flight);
    io:println(rStr);
}

是也不是。

是的,根据规范内联是合法的,不,它还没有实现,我想我们可以期待它很快就会实现。

正如@Kishanthan 在他的回答中提到的,有两种方法可以将 Json 转换为字符串,但当前的 Ballerina 实现不允许它们在一行中使用。

根据 Ballerina 规范,string jStr = (<json> flight but {error => <json> ""}).toString(); 是合法的,甚至 <json> flight but {error => <json> ""}.toString(); 似乎也是合法的。目前 ballerina 编译器似乎不允许对表达式进行方法调用,它只支持对变量引用进行方法调用。

您可以在 https://ballerina.io/learn/ 下找到当前版本的规范。

将记录转换为 json: json|error flightJson = json.convert(flight);

将记录转换为地图: map<anydata>|error flightMap = map<anydata>.convert(flight);

将json转换为记录: Flight|error flight = Flight.convert(flightJson);

将json转换为字符串: string flightString = flightJson.toString();

目前没有从记录到字符串的转换。您需要通过 json 或映射并处理潜在的 错误 ,或者按照上面的建议使用 sprintf。

Look this example