Reading JSON struct from file adds prefix 'x' to fieldname if it starts with number
6 views (last 30 days)
Show older comments
I am reading JSON file using readstruct, and it works well otherwise, but for fieldnames that would start with a number there is 'x' added to the beginning. I have tried to search info for this feature, both for Matlab and JSON standard in general, but I cannot find anything that would explain why 'x' is added.
- Is this feature only in Matlab, or is it something defined for JSON standard ?
- Is there a way to disable this prefix or change it to something else?
Note that I cannot affect to the JSON files how they are originally written.
1 Comment
Stephen23
on 4 Sep 2025
"Field names can contain ASCII letters (A–Z, a–z), digits (0–9), and underscores, and must begin with a letter. The maximum length of a field name is namelengthmax."
Accepted Answer
Matt J
on 4 Sep 2025
Edited: Matt J
on 4 Sep 2025
but I cannot find anything that would explain why 'x' is added.
Presumably you know that something must be added, because variable and field names starting with numbers are illegal in Matlab.
>> S.3abc=5
S.3abc=5
↑
Invalid expression. Check for missing multiplication operator, missing or unbalanced delimiters, or other syntax
error. To construct matrices, use brackets instead of parentheses.
If you want a different prefix, one option would be to post-process the field names, e.g.,
S.a=2;
S.b=3;
S.x1=7;
S.x2=11
prefix="y";
F=string(fieldnames(S))';
idx=startsWith(F,"x"+digitsPattern);
F=F(idx);
for k=1:numel(F)
f=F{k};
fnew=prefix+f(2:end);
S.(fnew)=S.(f);
end
S=rmfield(S,F)
6 Comments
Steven Lord
on 8 Sep 2025
You'd need to avoid #d..., #e..., #i, and #j.
format shortg
x = [1d2; 1e2; 1i; 1j]
y = [0xff; 0b111]
There may be other number-letter leading combinations that you'd have to avoid, but it's late here and I can't think of them off the top of my head.
More Answers (1)
Catalytic
on 5 Sep 2025
Note that I cannot affect to the JSON files how they are originally written.
It is easy enough to write a function to modify them -
modifyJSON('music.json', 'newmusic.json', 'ggg')
type music.json
{
"1Ensemble": {
"2Music": "jazz",
"3BandName": "Kool Katz",
"4Instrumentation": [
{
"Type": "wind",
"Instrument": "trumpet",
},
{
"Type": "percussion",
"Instrument": "piano",
"Pianotype": "concert grand",
},
{
"Type": "percussion",
"Instrument": "drums",
"Drumkit": [
"bass drum",
"floor tom",
"snare drum",
"hi-hat",
"ride cymbal"
],
},
{
"Type": "string",
"Instrument": "bass",
"Basstype": "upright"
}
]
},
"5Musicians": [
{
"Role": "trumpeter",
"Name": "Miles"
},
{
"Role": "vocalist",
"Name": "Roger"
},
{
"Role": "pianist",
"Name": "Diana"
},
{
"Role": "drummer",
"Name": "George"
},
{
"Role": "bassist",
"Name": "John"
}
]
}
type newmusic.json
{
"ggg1Ensemble": {
"ggg2Music": "jazz",
"ggg3BandName": "Kool Katz",
"ggg4Instrumentation": [
{
"Type": "wind",
"Instrument": "trumpet",
},
{
"Type": "percussion",
"Instrument": "piano",
"Pianotype": "concert grand",
},
{
"Type": "percussion",
"Instrument": "drums",
"Drumkit": [
"bass drum",
"floor tom",
"snare drum",
"hi-hat",
"ride cymbal"
],
},
{
"Type": "string",
"Instrument": "bass",
"Basstype": "upright"
}
]
},
"ggg5Musicians": [
{
"Role": "trumpeter",
"Name": "Miles"
},
{
"Role": "vocalist",
"Name": "Roger"
},
{
"Role": "pianist",
"Name": "Diana"
},
{
"Role": "drummer",
"Name": "George"
},
{
"Role": "bassist",
"Name": "John"
}
]
}
function modifyJSON(oldfile,newfile, prefix)
arguments
oldfile string, newfile string
prefix string
end
Str=readlines(oldfile);
pat=whitespacePattern+'"'+digitsPattern+alphanumericsPattern+'":';
k=startsWith(Str,pat);
str=Str(k);
for i=1:numel(str)
s=extractBetween(str(i), whitespacePattern+'"', '":');
str(i)=replaceBetween(str(i), whitespacePattern+'"', '":', prefix+s);
end
Str(k)=str;
writelines(Str, newfile);
end
1 Comment
Matt J
on 5 Sep 2025
You could also use jsondecode to go directly to a struct if your original file are strictly JSON compliant (e.g., no trailing commas),
outputStruct = jsondecode(strjoin(Str,newline))
See Also
Categories
Find more on JSON Format in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!