sort_json.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import json
  2. import sys
  3. # Use command-line argument for JSON path
  4. if len(sys.argv) < 2:
  5. print("Usage: python sort_json.py <path_to_json>")
  6. sys.exit(1)
  7. json_path = sys.argv[1]
  8. # Define custom category order
  9. CATEGORY_ORDER = ["time", "pvoc", "utility"]
  10. # Define desired parameter field order
  11. FIELD_ORDER = [
  12. "paramname", "paramdescription", "automatable", "outputduration", "time",
  13. "min", "max", "flag", "minrange", "maxrange", "step",
  14. "value", "exponential", "uitype"
  15. ]
  16. def category_sort_key(item):
  17. category = item.get("category", "").lower()
  18. return CATEGORY_ORDER.index(category) if category in CATEGORY_ORDER else len(CATEGORY_ORDER)
  19. def extract_param_index(param_key):
  20. # Extract number from param key like 'param1', 'param10'
  21. try:
  22. return int(''.join(filter(str.isdigit, param_key)))
  23. except:
  24. return float('inf')
  25. def reorder_param_fields(param):
  26. # Reorder fields within a single parameter dict
  27. ordered = {field: param[field] for field in FIELD_ORDER if field in param}
  28. for k in param:
  29. if k not in ordered:
  30. ordered[k] = param[k]
  31. return ordered
  32. # Load JSON
  33. with open(json_path, "r", encoding="utf-8") as f:
  34. data = json.load(f)
  35. # Convert dict to sortable list
  36. items = [{"key": k, **v} for k, v in data.items()]
  37. # Sort items by category, subcategory, and title
  38. items_sorted = sorted(items, key=lambda item: (
  39. category_sort_key(item),
  40. item.get("subcategory", "").lower(),
  41. item.get("title", "").lower()
  42. ))
  43. # Process each item's parameters
  44. for item in items_sorted:
  45. parameters = item.get("parameters", {})
  46. # Sort parameter keys like param1, param2, ..., param10
  47. sorted_keys = sorted(parameters.keys(), key=extract_param_index)
  48. # Reorder fields inside each parameter
  49. sorted_parameters = {
  50. k: reorder_param_fields(parameters[k]) for k in sorted_keys
  51. }
  52. item["parameters"] = sorted_parameters
  53. # Rebuild dictionary with sorted keys
  54. sorted_data = {
  55. item["key"]: {k: item[k] for k in item if k != "key"}
  56. for item in items_sorted
  57. }
  58. # Overwrite original file
  59. with open(json_path, "w", encoding="utf-8") as f:
  60. json.dump(sorted_data, f, indent=2, ensure_ascii=False)
  61. print(f"Sorted and overwritten: {json_path}")