sort_json.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import json
  2. import sys
  3. from collections import OrderedDict
  4. # --- Custom category order ---
  5. CATEGORY_ORDER = ["time", "pvoc", "utility"]
  6. # --- Desired param key order ---
  7. PARAM_ORDER = [
  8. "paramname",
  9. "paramdescription",
  10. "automatable",
  11. "time",
  12. "min",
  13. "max",
  14. "flag",
  15. "minrange",
  16. "maxrange",
  17. "step",
  18. "value",
  19. "exponential",
  20. "uitype"
  21. ]
  22. # --- Load JSON path from args ---
  23. if len(sys.argv) < 2:
  24. print("Usage: python sort_json.py path_to_json")
  25. sys.exit(1)
  26. json_path = sys.argv[1]
  27. with open(json_path, "r", encoding="utf-8") as f:
  28. data = json.load(f)
  29. # --- Reorder parameter fields ---
  30. def reorder_param_fields(param):
  31. return OrderedDict((k, param[k]) for k in PARAM_ORDER if k in param)
  32. # --- Convert to sortable items ---
  33. items = [{"key": k, **v} for k, v in data.items()]
  34. # --- Sort by category, subcategory, title ---
  35. items_sorted = sorted(
  36. items,
  37. key=lambda item: (
  38. CATEGORY_ORDER.index(item.get("category", "")) if item.get("category", "") in CATEGORY_ORDER else 999,
  39. item.get("subcategory", "").lower(),
  40. item.get("title", "").lower()
  41. )
  42. )
  43. # --- Rebuild with sorted parameter fields ---
  44. sorted_data = {}
  45. for item in items_sorted:
  46. key = item.pop("key")
  47. if "parameters" in item:
  48. item["parameters"] = {
  49. param_key: reorder_param_fields(param_val)
  50. for param_key, param_val in item["parameters"].items()
  51. }
  52. sorted_data[key] = item
  53. # --- Overwrite the original file ---
  54. with open(json_path, "w", encoding="utf-8") as f:
  55. json.dump(sorted_data, f, indent=2, ensure_ascii=False)
  56. print(f"Sorted JSON saved to {json_path}")