diff --git a/plexpy/exporter.py b/plexpy/exporter.py index 487fc191..666ce0cd 100644 --- a/plexpy/exporter.py +++ b/plexpy/exporter.py @@ -1650,12 +1650,14 @@ class Export(object): writer.writerows(csv_data) elif self.file_format == 'json': - json_data = json.dumps(result, indent=4, ensure_ascii=False, sort_keys=True) + json_data = json.dumps(helpers.sort_obj(result), + indent=4, ensure_ascii=False) with open(filepath, 'w', encoding='utf-8') as outfile: outfile.write(json_data) elif self.file_format == 'xml': - xml_data = helpers.dict_to_xml({self.media_type: result}, root_node='export', indent=4) + xml_data = helpers.dict_to_xml({self.media_type: helpers.sort_obj(result)}, + root_node='export', indent=4) with open(filepath, 'w', encoding='utf-8') as outfile: outfile.write(xml_data) diff --git a/plexpy/helpers.py b/plexpy/helpers.py index abeabaca..80028e2f 100644 --- a/plexpy/helpers.py +++ b/plexpy/helpers.py @@ -27,6 +27,7 @@ import cloudinary from cloudinary.api import delete_resources_by_tag from cloudinary.uploader import upload from cloudinary.utils import cloudinary_url +from collections import OrderedDict import datetime from functools import reduce, wraps import hashlib @@ -1244,6 +1245,31 @@ def sort_attrs(attr): return len(a), a +def sort_obj(obj): + if isinstance(obj, list): + result_obj = [] + for item in obj: + result_obj.append(sort_obj(item)) + elif isinstance(obj, dict): + result_start = [] + result_end = [] + for k, v in obj.items(): + if isinstance(v, list): + for item in v: + if isinstance(item, dict): + result_end.append([k, sort_obj(v)]) + else: + result_start.append([k, sort_obj(v)]) + else: + result_start.append([k, sort_obj(v)]) + + result_obj = OrderedDict(sorted(result_start) + sorted(result_end)) + else: + result_obj = obj + + return result_obj + + def get_attrs_to_dict(obj, attrs): d = {}