@@ -304,6 +304,67 @@ pub fn flatten_array_objects(
304304 Ok ( ( ) )
305305}
306306
307+ pub fn flatten_json ( value : & Value ) -> Vec < Value > {
308+ match value {
309+ Value :: Array ( arr) => {
310+ let mut results = Vec :: new ( ) ;
311+ for item in arr {
312+ results. extend ( flatten_json ( item) ) ;
313+ }
314+ results
315+ }
316+ Value :: Object ( map) => {
317+ let mut results = vec ! [ map. clone( ) ] ;
318+ for ( key, val) in map {
319+ if matches ! ( val, Value :: Array ( _) ) {
320+ if let Value :: Array ( arr) = val {
321+ let mut new_results = Vec :: new ( ) ;
322+ for item in arr {
323+ let flattened_items = flatten_json ( item) ;
324+ for flattened_item in flattened_items {
325+ for result in & results {
326+ let mut new_obj = result. clone ( ) ;
327+ new_obj. insert ( key. clone ( ) , flattened_item. clone ( ) ) ;
328+ new_results. push ( new_obj) ;
329+ }
330+ }
331+ }
332+ results = new_results;
333+ }
334+ } else if matches ! ( val, Value :: Object ( _) ) {
335+ let nested_results = flatten_json ( val) ;
336+ let mut new_results = Vec :: new ( ) ;
337+ for nested_result in nested_results {
338+ for result in & results {
339+ let mut new_obj = result. clone ( ) ;
340+ new_obj. insert ( key. clone ( ) , nested_result. clone ( ) ) ;
341+ new_results. push ( new_obj) ;
342+ }
343+ }
344+ results = new_results;
345+ }
346+ }
347+ results. into_iter ( ) . map ( Value :: Object ) . collect ( )
348+ }
349+ _ => vec ! [ value. clone( ) ] ,
350+ }
351+ }
352+
353+ pub fn convert_to_array ( flattened : Vec < Value > ) -> Result < Value , anyhow:: Error > {
354+ let mut result = Vec :: new ( ) ;
355+ for item in flattened {
356+ let mut map = Map :: new ( ) ;
357+ if let Some ( item) = item. as_object ( ) {
358+ for ( key, value) in item {
359+ map. insert ( key. clone ( ) , value. clone ( ) ) ;
360+ }
361+ result. push ( Value :: Object ( map) ) ;
362+ } else {
363+ return Err ( anyhow ! ( "Expected object in array of objects" ) ) ;
364+ }
365+ }
366+ Ok ( Value :: Array ( result) )
367+ }
307368#[ cfg( test) ]
308369mod tests {
309370 use crate :: utils:: json:: flatten:: flatten_array_objects;
0 commit comments