def compare_json_data(source_data_a, source_data_b):
    def compare(data_a, data_b):
        # type: list
        if (type(data_a) is list):
            # is [data_b] a list and of same length as [data_a]?
            if ((type(data_b) != list) or (len(data_a) != len(data_b))):
                return False

            # iterate over list items
            for list_index, list_item in enumerate(data_a):
                # compare [data_a] list item against [data_b] at index
                if (not compare(list_item, data_b[list_index])):
                    return False

            # list identical
            return True

        if (type(data_a) is dict):
            # is [data_b] a dictionary?
            if (type(data_b) != dict):
                return False

            # iterate over dictionary keys
            for dict_key, dict_value in data_a.items():
                # key exists in [data_b] dictionary, and same value?
                if (
                    (dict_key not in data_b)
                    or (not compare(dict_value, data_b[dict_key]))
                ):
                    return False

            # dictionary identical
            return True

        # simple value - compare both value and type for equality
        return ((data_a == data_b) and (type(data_a) is type(data_b)))

    # compare a to b, then b to a
    return (
        compare(source_data_a, source_data_b)
        and compare(source_data_b, source_data_a)
    )
