|
@@ -1,67 +1,75 @@
|
|
|
import json
|
|
import json
|
|
|
import sys
|
|
import sys
|
|
|
-from collections import OrderedDict
|
|
|
|
|
|
|
|
|
|
-# --- Custom category order ---
|
|
|
|
|
|
|
+# Use command-line argument for JSON path
|
|
|
|
|
+if len(sys.argv) < 2:
|
|
|
|
|
+ print("Usage: python sort_json.py <path_to_json>")
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+
|
|
|
|
|
+json_path = sys.argv[1]
|
|
|
|
|
+
|
|
|
|
|
+# Define custom category order
|
|
|
CATEGORY_ORDER = ["time", "pvoc", "utility"]
|
|
CATEGORY_ORDER = ["time", "pvoc", "utility"]
|
|
|
|
|
|
|
|
-# --- Desired param key order ---
|
|
|
|
|
-PARAM_ORDER = [
|
|
|
|
|
- "paramname",
|
|
|
|
|
- "paramdescription",
|
|
|
|
|
- "automatable",
|
|
|
|
|
- "time",
|
|
|
|
|
- "min",
|
|
|
|
|
- "max",
|
|
|
|
|
- "flag",
|
|
|
|
|
- "minrange",
|
|
|
|
|
- "maxrange",
|
|
|
|
|
- "step",
|
|
|
|
|
- "value",
|
|
|
|
|
- "exponential",
|
|
|
|
|
- "uitype"
|
|
|
|
|
|
|
+# Define desired parameter field order
|
|
|
|
|
+FIELD_ORDER = [
|
|
|
|
|
+ "paramname", "paramdescription", "automatable", "time",
|
|
|
|
|
+ "min", "max", "flag", "minrange", "maxrange", "step",
|
|
|
|
|
+ "value", "exponential", "uitype"
|
|
|
]
|
|
]
|
|
|
|
|
|
|
|
-# --- Load JSON path from args ---
|
|
|
|
|
-if len(sys.argv) < 2:
|
|
|
|
|
- print("Usage: python sort_json.py path_to_json")
|
|
|
|
|
- sys.exit(1)
|
|
|
|
|
|
|
+def category_sort_key(item):
|
|
|
|
|
+ category = item.get("category", "").lower()
|
|
|
|
|
+ return CATEGORY_ORDER.index(category) if category in CATEGORY_ORDER else len(CATEGORY_ORDER)
|
|
|
|
|
|
|
|
-json_path = sys.argv[1]
|
|
|
|
|
|
|
+def extract_param_index(param_key):
|
|
|
|
|
+ # Extract number from param key like 'param1', 'param10'
|
|
|
|
|
+ try:
|
|
|
|
|
+ return int(''.join(filter(str.isdigit, param_key)))
|
|
|
|
|
+ except:
|
|
|
|
|
+ return float('inf')
|
|
|
|
|
+
|
|
|
|
|
+def reorder_param_fields(param):
|
|
|
|
|
+ # Reorder fields within a single parameter dict
|
|
|
|
|
+ ordered = {field: param[field] for field in FIELD_ORDER if field in param}
|
|
|
|
|
+ for k in param:
|
|
|
|
|
+ if k not in ordered:
|
|
|
|
|
+ ordered[k] = param[k]
|
|
|
|
|
+ return ordered
|
|
|
|
|
|
|
|
|
|
+# Load JSON
|
|
|
with open(json_path, "r", encoding="utf-8") as f:
|
|
with open(json_path, "r", encoding="utf-8") as f:
|
|
|
data = json.load(f)
|
|
data = json.load(f)
|
|
|
|
|
|
|
|
-# --- Reorder parameter fields ---
|
|
|
|
|
-def reorder_param_fields(param):
|
|
|
|
|
- return OrderedDict((k, param[k]) for k in PARAM_ORDER if k in param)
|
|
|
|
|
-
|
|
|
|
|
-# --- Convert to sortable items ---
|
|
|
|
|
|
|
+# Convert dict to sortable list
|
|
|
items = [{"key": k, **v} for k, v in data.items()]
|
|
items = [{"key": k, **v} for k, v in data.items()]
|
|
|
|
|
|
|
|
-# --- Sort by category, subcategory, title ---
|
|
|
|
|
-items_sorted = sorted(
|
|
|
|
|
- items,
|
|
|
|
|
- key=lambda item: (
|
|
|
|
|
- CATEGORY_ORDER.index(item.get("category", "")) if item.get("category", "") in CATEGORY_ORDER else 999,
|
|
|
|
|
- item.get("subcategory", "").lower(),
|
|
|
|
|
- item.get("title", "").lower()
|
|
|
|
|
- )
|
|
|
|
|
-)
|
|
|
|
|
|
|
+# Sort items by category, subcategory, and title
|
|
|
|
|
+items_sorted = sorted(items, key=lambda item: (
|
|
|
|
|
+ category_sort_key(item),
|
|
|
|
|
+ item.get("subcategory", "").lower(),
|
|
|
|
|
+ item.get("title", "").lower()
|
|
|
|
|
+))
|
|
|
|
|
|
|
|
-# --- Rebuild with sorted parameter fields ---
|
|
|
|
|
-sorted_data = {}
|
|
|
|
|
|
|
+# Process each item's parameters
|
|
|
for item in items_sorted:
|
|
for item in items_sorted:
|
|
|
- key = item.pop("key")
|
|
|
|
|
- if "parameters" in item:
|
|
|
|
|
- item["parameters"] = {
|
|
|
|
|
- param_key: reorder_param_fields(param_val)
|
|
|
|
|
- for param_key, param_val in item["parameters"].items()
|
|
|
|
|
- }
|
|
|
|
|
- sorted_data[key] = item
|
|
|
|
|
|
|
+ parameters = item.get("parameters", {})
|
|
|
|
|
+ # Sort parameter keys like param1, param2, ..., param10
|
|
|
|
|
+ sorted_keys = sorted(parameters.keys(), key=extract_param_index)
|
|
|
|
|
+ # Reorder fields inside each parameter
|
|
|
|
|
+ sorted_parameters = {
|
|
|
|
|
+ k: reorder_param_fields(parameters[k]) for k in sorted_keys
|
|
|
|
|
+ }
|
|
|
|
|
+ item["parameters"] = sorted_parameters
|
|
|
|
|
+
|
|
|
|
|
+# Rebuild dictionary with sorted keys
|
|
|
|
|
+sorted_data = {
|
|
|
|
|
+ item["key"]: {k: item[k] for k in item if k != "key"}
|
|
|
|
|
+ for item in items_sorted
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
-# --- Overwrite the original file ---
|
|
|
|
|
|
|
+# Overwrite original file
|
|
|
with open(json_path, "w", encoding="utf-8") as f:
|
|
with open(json_path, "w", encoding="utf-8") as f:
|
|
|
json.dump(sorted_data, f, indent=2, ensure_ascii=False)
|
|
json.dump(sorted_data, f, indent=2, ensure_ascii=False)
|
|
|
|
|
|
|
|
-print(f"Sorted JSON saved to {json_path}")
|
|
|
|
|
|
|
+print(f"Sorted and overwritten: {json_path}")
|