@@ -110,6 +110,34 @@ def __iter__(self):
110110 raise RuntimeError ('DataContainer Iteration not supported without _version' )
111111 return iter ([getattr (self , field .name ) for field in self ._struct .untagged_fields (self ._version )])
112112
113+ def _to_dict_vals (self , meta = False , json = True ):
114+ if meta :
115+ yield ('_type' , self .__class__ .__name__ )
116+ yield ('_version' , self ._version )
117+ if meta != 'all' :
118+ meta = False
119+ for field in self ._struct ._fields :
120+ if self ._version is not None and not field .for_version_q (self ._version ):
121+ continue
122+ if field .is_struct ():
123+ yield (field .name , dict (getattr (self , field .name )._to_dict_vals (meta = meta , json = json )))
124+ elif field .is_struct_array ():
125+ yield (field .name , [dict (val ._to_dict_vals (meta = meta , json = json )) for val in getattr (self , field .name )])
126+ else :
127+ val = getattr (self , field .name )
128+ if json :
129+ if isinstance (val , bytes ):
130+ val = val .decode ()
131+ elif isinstance (val , set ):
132+ val = list (val )
133+ yield (field .name , val )
134+
135+ def to_dict (self , meta = False , json = True ):
136+ """Use meta=True to include top-level version; meta='all' to include all internal versions
137+ json=False to return raw encoding; json=True (default) to convert values to be json-serializable
138+ """
139+ return dict (self ._to_dict_vals (meta = meta , json = json ))
140+
113141 def __getitem__ (self , key ):
114142 if self ._version is None :
115143 raise RuntimeError ('DataContainer subscript not supported without _version' )
0 commit comments