Reading JSON struct from file adds prefix 'x' to fieldname if it starts with number
64 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Petri M
el 4 de Sept. de 2025 a las 12:10
Comentada: Petri M
el 8 de Sept. de 2025 a las 9:15
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 comentario
Stephen23
el 4 de Sept. de 2025 a las 12:36
"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."
Respuesta aceptada
Matt J
el 4 de Sept. de 2025 a las 12:14
Editada: Matt J
el 4 de Sept. de 2025 a las 12:38
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 comentarios
Steven Lord
el 8 de Sept. de 2025 a las 4:57
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.
Más respuestas (1)
Catalytic
el 5 de Sept. de 2025 a las 5:31
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 comentario
Matt J
el 5 de Sept. de 2025 a las 5:42
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))
Ver también
Categorías
Más información sobre JSON Format en Help Center y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!