ObjectToJsonArrayConverter.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import json
  2. class ObjectToJsonArrayConverter:
  3. """
  4. 将Python对象转换为特定结构的JSON数组。
  5. """
  6. @staticmethod
  7. def convert(obj):
  8. """
  9. 递归转换对象为JSON数组结构。
  10. Args:
  11. obj: 待转换的Python对象(dict/list/其他)
  12. Returns:
  13. list: 转换后的结构,每个元素为 {"key": key, "value": processed_value}
  14. """
  15. def _process(value, in_list_context):
  16. """处理值,根据是否在列表环境中决定包装逻辑"""
  17. if isinstance(value, dict):
  18. # 字典递归转换为列表结构
  19. return ObjectToJsonArrayConverter.convert(value)
  20. if isinstance(value, list):
  21. # 列表递归处理,子元素默认在列表环境中
  22. return [_process(item, in_list_context=True) for item in value]
  23. # 普通值:列表环境中不包装,否则包装为单元素列表
  24. return value if in_list_context else [value]
  25. # 处理外层对象
  26. if isinstance(obj, dict):
  27. return [{"key": k, "value": _process(v, False)} for k, v in obj.items()]
  28. if isinstance(obj, list):
  29. return [{"key": None, "value": _process(item, True)} for item in obj]
  30. return [] # 非dict/list返回空(根据原逻辑)
  31. @staticmethod
  32. def to_json(obj, indent=None):
  33. """
  34. 转换为JSON字符串。
  35. Args:
  36. obj: 待转换对象
  37. indent: 缩进量(默认无缩进)
  38. Returns:
  39. str: JSON字符串
  40. """
  41. return json.dumps(
  42. ObjectToJsonArrayConverter.convert(obj),
  43. indent=indent,
  44. ensure_ascii=False
  45. )
  46. # 测试代码
  47. if __name__ == "__main__":
  48. test_obj = [
  49. {"name": "Alice"},
  50. [{"age": 30}, "直接值"]
  51. ]
  52. print(ObjectToJsonArrayConverter.to_json(test_obj, indent=4))