async fetchJson(info, init) {
    const lionInit = {
      ...init,
      headers: {
        ...init?.headers,
        accept: 'application/json',
      },
    };

    if (lionInit?.body) {
      // eslint-disable-next-line no-param-reassign
      lionInit.headers['content-type'] = 'application/json';
      lionInit.body = JSON.stringify(lionInit.body);
    }

    // typecast LionRequestInit back to RequestInit
    const jsonInit = /** @type {RequestInit} */ (lionInit);
    const response = await this.fetch(info, jsonInit, true);

    let body = await this.__parseBody(response);
    if (typeof body === 'object') {
      body = await this.__interceptResponseJson(body, response);
    }

    return { response, body };
  }
Fetch by calling the registered request and response
interceptors. And supports JSON by:
 - Serializing request body as JSON
 - Deserializing response payload as JSON
 - Adding the correct Content-Type and Accept headers

@template T
@param {RequestInfo} info
@param {LionRequestInit} [init]
@returns {Promise<{ response: Response, body: string | T }>}