"""
自定义的一些 json功能
"""
import json
import re


def underscore_to_camelcase(snake_str):
    """ 将下划线命名转换为驼峰命名 """
    components = snake_str.split('_')
    return components[0] + ''.join(x.title() for x in components[1:])


def camelcase_to_underscore(camel_str):
    """将驼峰命名转换为下划线命名"""
    return re.sub(r'(?<!^)(?=[A-Z])', '_', camel_str).lower()


def convert_keys_to_camelcase(obj):
    """ 递归处理 JSON 对象 """
    if isinstance(obj, dict):
        new_obj = {}
        for k, v in obj.items():
            new_key = underscore_to_camelcase(k)
            new_obj[new_key] = convert_keys_to_camelcase(v)
        return new_obj
    elif isinstance(obj, list):
        return [convert_keys_to_camelcase(item) for item in obj]
    else:
        return obj


def convert_keys_to_underscore(obj):
    if isinstance(obj, dict):
        new_obj = {}
        for k, v in obj.items():
            new_key = camelcase_to_underscore(k)
            new_obj[new_key] = convert_keys_to_underscore(v)
        return new_obj
    elif isinstance(obj, list):
        return [convert_keys_to_underscore(item) for item in obj]
    else:
        return obj


def parse_json_from_string(input_str):
    result = []  # 存储成功解析的 JSON 对象
    stack = []  # 栈,用于追踪 '{'
    temp_str = ""  # 临时存储 JSON 字符串

    for i, char in enumerate(input_str):
        temp_str += char
        if char == '{':
            stack.append(char)
        elif char == '}':
            if stack:
                stack.pop()  # 配对成功一个 '{'
            # 检查栈是否为空,表示一个完整的 JSON 片段
            if not stack:
                try:
                    parsed_json = json.loads(temp_str)
                    result.append(parsed_json)
                    temp_str = ""  # 清空临时字符串
                except json.JSONDecodeError:
                    # 解析失败,可能是嵌套不完整,继续累积字符
                    pass
    return result


def find_key(data, target_key):
    if isinstance(data, dict):
        # 如果是字典,递归查找每个键
        for key, value in data.items():
            if key == target_key:
                return value
            result = find_key(value, target_key)
            if result:
                return result
    elif isinstance(data, list):
        # 如果是列表,递归查找每个元素
        for item in data:
            result = find_key(item, target_key)
            if result:
                return result
    return None