芭蕾舞演员 "type 'json' does not support field access for assignment"
Ballerina "type 'json' does not support field access for assignment"
我正在使用 Ballerina 语言创建一个 RESTful Web 服务,用于按照 here 中的说明在在线零售商店中进行订单管理。在处理 HTTP PUT 请求的资源函数中,有一段代码将从 json 地图对象(当前用于存储订单,尚未连接数据库。)检索相关订单并更新一些其字段与来自 json 对象的字段的比例,该对象是通过 HTTP PUT 请求接收到的。
我已经声明了 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 结构的形状时,最好创建相关类型并对其进行操作,如果您需要a 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.
}
}
芭蕾舞演员 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 值的结构与我们预期的不同,则会由于类型转换错误而导致恐慌。
如果您使用的是 Ballerina 1.2.4,我强烈建议您更新到最新的 Ballerina 1.2.x 版本(目前是 1.2.8,很快就是 1.2.9)。它们是向后兼容的。所以你更新应该没有问题。
针对您的问题,您可以使用 .
运算符访问 JSON 中的字段。看下面的例子。
如果您知道结构的确切形状,则可以使用已定义的 record
类型。然后您可以使用 constructFrom()
函数构造记录。否则,您还可以使用 .
运算符访问字段。
在这两种情况下,请务必相应地处理错误。我使用 checkpanic
只是为了展示功能,但您可以用更好的方式处理它。
import ballerina/io;
type Address record {
string no;
string street;
string city;
};
type Person record {
string name;
Address address;
};
public function main() {
json j = getJson();
Person p = checkpanic Person.constructFrom(j);
io:print("Person Record: ");
io:println(p);
json address = checkpanic j.address;
io:print("Address field from JSON: ");
io:println(address);
}
function getJson() returns json {
json j = {
name: "Sherlock",
address: {
no: "221/B",
street: "Baker Street",
city: "London"
}
};
return j;
}
这将打印以下内容:
Person Record: name=Sherlock address=no=221/B street=Baker Street city=London
Address field from JSON: no=221/B street=Baker Street city=London
在 Ballerina 1.2.8 上试过这个。
您可以查看更多 examples here。
我正在使用 Ballerina 语言创建一个 RESTful Web 服务,用于按照 here 中的说明在在线零售商店中进行订单管理。在处理 HTTP PUT 请求的资源函数中,有一段代码将从 json 地图对象(当前用于存储订单,尚未连接数据库。)检索相关订单并更新一些其字段与来自 json 对象的字段的比例,该对象是通过 HTTP PUT 请求接收到的。
我已经声明了 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 结构的形状时,最好创建相关类型并对其进行操作,如果您需要a 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.
}
}
芭蕾舞演员 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 值的结构与我们预期的不同,则会由于类型转换错误而导致恐慌。
如果您使用的是 Ballerina 1.2.4,我强烈建议您更新到最新的 Ballerina 1.2.x 版本(目前是 1.2.8,很快就是 1.2.9)。它们是向后兼容的。所以你更新应该没有问题。
针对您的问题,您可以使用 .
运算符访问 JSON 中的字段。看下面的例子。
如果您知道结构的确切形状,则可以使用已定义的 record
类型。然后您可以使用 constructFrom()
函数构造记录。否则,您还可以使用 .
运算符访问字段。
在这两种情况下,请务必相应地处理错误。我使用 checkpanic
只是为了展示功能,但您可以用更好的方式处理它。
import ballerina/io;
type Address record {
string no;
string street;
string city;
};
type Person record {
string name;
Address address;
};
public function main() {
json j = getJson();
Person p = checkpanic Person.constructFrom(j);
io:print("Person Record: ");
io:println(p);
json address = checkpanic j.address;
io:print("Address field from JSON: ");
io:println(address);
}
function getJson() returns json {
json j = {
name: "Sherlock",
address: {
no: "221/B",
street: "Baker Street",
city: "London"
}
};
return j;
}
这将打印以下内容:
Person Record: name=Sherlock address=no=221/B street=Baker Street city=London
Address field from JSON: no=221/B street=Baker Street city=London
在 Ballerina 1.2.8 上试过这个。
您可以查看更多 examples here。