Handle invalid fieldnames when parsing python dict to matlab via struct

7 views (last 30 days)
I am trying to convert a python dict to a Matlab struct like so:
pyClass = py.someClass.someSubClass();
data = x.someFunction();
data = struct(data);
This usually works fine, however, Matlab throws the following error:
Error using py.dict/struct
Invalid field name "yyy/xxx"
I know that Matlab requires the following three conditions for fieldnames to be valid:
start with a letter, otherwise assigning to that field will error
contain only letters, numbers, and/or the underscore character, otherwise assigning to that field will error,
and must be no longer than namelengthmax (currently 63) characters, otherwise you will receive a warning and the field name will be truncated
Does anyone know how I can handle this error - i.e. have a small python function that I can call from within Matlab to remove invalid characters?
Here is a snippet of what the python dict looks like (in this case the "/" is the issue):
data =
Python dict with no properties.
{'BTC/USD': {'fee_loaded': False, 'percentage': True, 'tierBased': True, 'maker': 0.001, 'taker': 0.002, 'tiers': {'taker': [[0, 0.002], ...
Thanks in advance!

Accepted Answer

Benvaulter
Benvaulter on 8 May 2018
I solved the issue by coverting the dict within python to json and then outputting the json to matlab where I then decode the data to retrieve the final struct which works perfectly fine for me so far. Here is the solution that I came up with:
pyClass = py.someClass.someSubClass();
data = x.someFunction();
data = py.json.dumps(data);
data = char(data);
data = jsondecode(data);

More Answers (1)

Steven Lord
Steven Lord on 8 May 2018
If you can get a list of the names in your dict object that you want to be the fieldnames in the MATLAB struct array, pass them through matlab.lang.makeValidName.
  1 Comment
Martin Ryba
Martin Ryba on 1 Sep 2024
Edited: Martin Ryba on 1 Sep 2024
So, it would be very handy if there was flag to the struct() function to do this. I can't use the JSON hack as dumps() is erroring on "Object of type MaskedArray is not JSON serializable". Is there a sample script as to how we extract the names from the dict, clean them up, and then pass the right pieces into struct()? Otherwise, I'm stuck.
Follow-up: I found I could use the dict object's get() method to retrieve just the keys I wanted and avoid the unwanted one with the bad name:
dat = radar.fields.get('reflectivity'); % Retrieve reflectivity from dict of dicts
data = double(dat.get('data')); % Pull the data and convert numpy MaskedArray to double

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!