在Matlab结构中使用字段名称中的句点

时间:2015-10-26 06:04:46

标签: json matlab struct

我正在使用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对象或者它是一个失败的原因?

3 个答案:

答案 0 :(得分:2)

不允许字段名称包含点。原因是因为这将与访问结构本身内的另一个嵌套结构相混淆。

例如,执行json.odata.metadata将被解释为jsonstruct,其成员的字段名称为odata,其中odata有另一个成员,字段名称为metadata。这将解释为组合字段名称为odata.metadata的成员。您将不得不将该字段重命名为其他字段或稍微更改字段名称的约定。

通常,惯例是用下划线替换点。如果您不愿意自己手动重命名字段名称,则自动处理此方法的方法是使用名为matlab.lang.makeValidName的函数,该函数接收字符串并将其转换为有效的字段名称。该功能在R2014a中引入。对于旧版本,它被称为genvarname

例如:

>> matlab.lang.makeValidName('odata.metadata')

ans =

odata_metadata

因此,要么使用_替换所有点以确保不含糊,或使用matlab.lang.makeValidNamegenvarname来为您处理此问题。

答案 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调用的众多Javapython 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功能来更新它......