From a39c6c10471446f8a1643d46b84194f13ad43c68 Mon Sep 17 00:00:00 2001 From: JonnyWong16 <9099342+JonnyWong16@users.noreply.github.com> Date: Sun, 11 Oct 2020 16:03:16 -0700 Subject: [PATCH] Improve sorting of json and xml export attributes --- plexpy/exporter.py | 6 ++++-- plexpy/helpers.py | 26 ++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) 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 = {}