gpt4 book ai didi

Ballerina "type ' json' 不支持分配字段访问"

转载 作者:行者123 更新时间:2023-12-04 03:52:00 24 4
gpt4 key购买 nike

我正在按照 here 中的说明,使用 Ballerina 语言创建用于在线零售商店订单管理的 RESTful Web 服务。 .在处理 HTTP PUT 请求的资源函数中,有一段代码将从 json 映射对象中检索相关订单(当前用于存储订单,尚未连接数据库。)并更新其某些字段来自 HTTP PUT 请求的 json 对象。

我已经声明了 json 映射对象 ordersMap。

map<json> ordersMap = {};

处理 PUT 请求的资源函数有一段代码如下:

// Get the json obejct from the payload
var updatedOrder = <@untained> req.getJsonPayload();

// Get the existing order that is required by the request from the json map object.
json existingOrder = ordersMap[orderId];

// Updating the necessaries and saving it in the map object.
existingOrder.Order.Name = updatedOrder.Order.Name;
existingOrder.Order.Description = updatedOrder.Order.Description;
ordersMap[orderId] = existingOrder;

当我尝试编译程序时,编译器抛出以下错误。

invalid operation: type 'json' does not support field access for assignment

我已经在网上寻找解决方案,但找不到任何东西。我正在使用 Ballerina 1.2.4

最佳答案

这是因为当您使用 json 数据类型时,编译器无法保证您正在访问的字段存在,并且(如果它不存在,则无法计算类型以插入相关条目)。

当你想对一段 json 数据进行操作,并且你知道这个 json 结构的形状时,创建相关类型并对其进行操作是个好主意,如果你想要一个 json 返回,那么你可以将它转换回来到 json。不幸的是,在 Ballerina 1.2.x 中没有直接的方法来转换为(和返回)json,如果你可以切换到 Ballerina Swanlake 轨道,你可以使用类似下面的东西。

import ballerina/io;

type Info record {
User user;
};

type User record {
string name;
string bal_version;
};


public function main() returns error? {
json j = { user: { name: "Hiran", bal_version: "1.2.4"}};
json k = { user: { name: "Hiran-New", bal_version: "1.2.4"}};
io:println(j);
// Convert json to expected datatype.
Info|error info = j.fromJsonWithType(Info);
if (info is Info) {
Info kInfo = check k.fromJsonWithType(Info);
info.user.name = kInfo.user.name;

// convert back to json
json newJ = info.toJson();
io:println(newJ);
} else {
// Expected json schema did not match.
// Handle the error here.
}
}

在芭蕾舞 Actor 1.2.x 中

import ballerina/io;

public function main() returns error? {
json j = { user: { name: "Hiran", bal_version: "1.2.4"}};
json k = { user: { name: "Hiran-New", bal_version: "1.2.4"}};
io:println(j);

map<json> mj = <map<json>> j;
map<json> user = <map<json>> mj.get("user");

user["name"] = <string> k.user.name;
// note, we update the original json value.
io:println(j);
}

第二种方法的一个大问题是,如果传入的 json 值的结构与我们预期的不同,它会由于类型转换错误而导致 panic 。

关于Ballerina "type ' json' 不支持分配字段访问",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64321335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com