我正在使用webwrite发布到api。我正在尝试设置发布的json对象中的一个字段名称是odata.metadata
。我正在为json对象创建一个看起来像这样的结构:
json = struct('odata.metadata', metadata, 'odata.type', type, 'Name', name,);
但是我收到了错误
Error using struct
Invalid field name "odata.metadata"
这是我想在Matlab中使用的json对象。为简单起见,所有字符串:
{
"odata.metadata": "https://website.com@Element",
"odata.type": "Blah.Blah.This.That",
"Name": "My Object"
}
有没有办法提交这个json对象或者它是一个失败的原因?
答案 0 :(得分:2)
不允许字段名称包含点。原因是因为这将与访问结构本身内的另一个嵌套结构相混淆。
例如,执行json.odata.metadata
将被解释为json
为struct
,其成员的字段名称为odata
,其中odata
有另一个成员,字段名称为metadata
。这将不解释为组合字段名称为odata.metadata
的成员。您将不得不将该字段重命名为其他字段或稍微更改字段名称的约定。
通常,惯例是用下划线替换点。如果您不愿意自己手动重命名字段名称,则自动处理此方法的方法是使用名为matlab.lang.makeValidName
的函数,该函数接收字符串并将其转换为有效的字段名称。该功能在R2014a中引入。对于旧版本,它被称为genvarname
。
例如:
>> matlab.lang.makeValidName('odata.metadata')
ans =
odata_metadata
因此,要么使用_
替换所有点以确保不含糊,或使用matlab.lang.makeValidName
或genvarname
来为您处理此问题。
答案 1 :(得分:2)
我建议使用aa containers.Map
而不是struct
来存储您的数据,然后通过迭代Map
字段名并将其与数据一起附加来创建您的JSON字符串你的JSON。
在这里快速演示我的意思:
%// Prepare the Map and the Data:
metadata = 'https://website.com@Element';
type = 'Blah.Blah.This.That';
name = 'My Object';
example_map = containers.Map({'odata.metadata','odata.type','Name'},...
{metadata,type,name});
%// Convert to JSON:
JSONstr = '{'; %// Initialization
map_keys = keys(example_map);
map_vals = values(example_map);
for ind1 = 1:example_map.Count
JSONstr = [JSONstr '"' map_keys{ind1} '":"' map_vals{ind1} '",'];
end
JSONstr =[JSONstr(1:end-1) '}']; %// Finalization (get rid of the last ',' and close)
这会产生有效的JSON字符串。
显然,如果您的values
不是字符串,则需要使用num2str
等转换它们。
您可能需要考虑的另一个选择是JSONlab FEX submission。我看到它的savejson.m
能够接受单元格数组 - 它可以容纳你喜欢的任何字符串。
其他替代方案可能包括您可以从MATLAB调用的众多Java
或python
JSON库中的任何一个。
答案 2 :(得分:1)
我可能不应该将此作为答案添加 - 但你可以拥有'。'在struct fieldname中......
在我走得更远之前 - 我不提倡这一点,它几乎肯定会导致错误和很多麻烦...... @rayryeng方法是一种更好的方法
如果您的结构是由mex函数创建的,该函数会创建一个包含“。”的字段。 - >那么你会得到你的追求。
要创建自己的测试,请参阅Mathworks example并相应地进行修改。
(我不会把完整的代码放在这里以阻止这种做法。)
如果更新char示例并编译为test_mex,则得到:
>> obj = test_mex
obj =
Doublestuff: [1x100 double]
odata.metadata: 'This is my char'
注意:您可以仅使用动态字段名访问Matlab中的自定义字段:
obj.('odata.metadata')
您需要使用mex功能来更新它......