def METHOD_NAME(s: str, **kwargs) -> 'core.NeuronList':
    """Load neuron from JSON (file or string).
    Parameters
    ----------
    s :         str
                Either filepath or JSON-formatted string.
    **kwargs
                Parameters passed to ``json.loads()`` and
                ``pandas.DataFrame.read_json()``.
    Returns
    -------
    :class:`~navis.NeuronList`
    See Also
    --------
    :func:`~navis.neuron2json`
                Turn neuron into json.
    Examples
    --------
    >>> import navis
    >>> n = navis.example_neurons(1)
    >>> js = navis.write_json(n, filepath=None)
    >>> n2 = navis.read_json(js)
    """
    if not isinstance(s, (str, Path)):
        raise TypeError(f'Expected str, got "{type(s)}"')
    # Try except is necessary because Path() throws a hissy fit if it is given
    # a long ass json string as filepath
    try:
        is_file = Path(s).is_file()
    except OSError:
        is_file = False
    except BaseException:
        raise
    if is_file:
        with open(Path(s), 'r') as f:
            data = json.load(f, **kwargs)
    else:
        data = json.loads(s, **kwargs)
    nl = core.NeuronList([])
    for n in data:
        cn = core.TreeNeuron(None)
        if '_nodes' in n:
            try:
                cn._nodes = pd.METHOD_NAME(n['_nodes'])
            except ValueError:
                cn._nodes = None
        if '_connectors' in n:
            try:
                cn._connectors = pd.METHOD_NAME(n['_connectors'])
            except ValueError:
                cn._connectors = None
        for key in n:
            if key in ['_nodes', '_connectors']:
                continue
            setattr(cn, key, n[key])
        nl += cn
    return nl