def METHOD_NAME(json1,  # pylint: disable=too-many-branches; linter balking on := walrus
              json2,
              path: List[str] = None,
              ignore_keys: List[str] = None) \
        -> Optional[List[Node]]:
    """Return the differences nodes between json1 & json2, being a list of dicts.
    JSON1 Rows missing an "id" will be marked as additions.
    JSON2 Rows missing an "id" are ignored.
    """
    if not (isinstance(json1, MutableSequence) or isinstance(json2, MutableSequence)):
        return None
    # if not json2
    if not json2:
        return [Node(
            old_value=None,
            new_value=json1,
            path=[''] if not path else path
        )]
    diff = []
    memoize = []
    for row1 in json1:
        add_row = True
        if row1_id := row1.get('id'):
            for row2 in json2:
                if row1_id == row2.get('id'):
                    if d := diff_dict(row1, row2, path + [str(row1_id)], ignore_keys, diff_list_callback=METHOD_NAME):
                        diff.extend(d)
                    memoize.append(row1_id)
                    add_row = False
                    break
        if add_row:
            diff.append(Node(
                old_value=None,
                new_value=row1,
                path=[''] if not path else path
            ))
    json2_rows = [x.get('id') for x in json2]
    if deleted_rows := set(json2_rows).difference(memoize):
        for row in json2:
            if row.get('id', '') in deleted_rows:
                diff.append(Node(
                    old_value=row,
                    new_value=None,
                    path=[''] if not path else path
                ))
    return diff