返回介绍

solution / 2700-2799 / 2759.Convert JSON String to Object / README

发布于 2024-06-17 01:03:00 字数 3251 浏览 0 评论 0 收藏 0

2759. 将 JSON 字符串转换为对象

English Version

题目描述

给定一个字符串 str ,返回 JSON 解析后的 parsedStr 。你可以假设 str 是一个有效的 JSON 字符串,因此它只包含字符串、数字、数组、对象、布尔值和 null。str 不会包含不可见字符和转义字符。

请在不使用内置的 JSON.parse 方法的情况下解决此问题。

 

示例 1:

输入:str = '{"a":2,"b":[1,2,3]}'
输出:{"a":2,"b":[1,2,3]}
解释:返回由 JSON 字符串表示的对象。

示例 2:

输入:str = 'true'
输出:true
解释:原始类型是有效的 JSON。

示例 3:

输入:str = '[1,5,"false",{"a":2}]'
输出:[1,5,"false",{"a":2}]
解释:返回由 JSON 字符串表示的数组。

 

提示:

  • str 是一个有效的 JSON 字符串
  • 1 <= str.length <= 105

解法

方法一

function jsonParse(str: string): any {
  const n = str.length;
  let i = 0;

  const parseTrue = (): boolean => {
    i += 4;
    return true;
  };

  const parseFalse = (): boolean => {
    i += 5;
    return false;
  };

  const parseNull = (): null => {
    i += 4;
    return null;
  };

  const parseNumber = (): number => {
    let s = '';
    while (i < n) {
      const c = str[i];
      if (c === ',' || c === '}' || c === ']') {
        break;
      }
      s += c;
      i++;
    }
    return Number(s);
  };

  const parseArray = (): any[] => {
    const arr: any[] = [];
    i++;
    while (i < n) {
      const c = str[i];
      if (c === ']') {
        i++;
        break;
      }
      if (c === ',') {
        i++;
        continue;
      }
      const value = parseValue();
      arr.push(value);
    }
    return arr;
  };

  const parseString = (): string => {
    let s = '';
    i++;
    while (i < n) {
      const c = str[i];
      if (c === '"') {
        i++;
        break;
      }
      if (c === '\\') {
        i++;
        s += str[i];
      } else {
        s += c;
      }
      i++;
    }
    return s;
  };

  const parseObject = (): any => {
    const obj: any = {};
    i++;
    while (i < n) {
      const c = str[i];
      if (c === '}') {
        i++;
        break;
      }
      if (c === ',') {
        i++;
        continue;
      }
      const key = parseString();
      i++;
      const value = parseValue();
      obj[key] = value;
    }
    return obj;
  };
  const parseValue = (): any => {
    const c = str[i];
    if (c === '{') {
      return parseObject();
    }
    if (c === '[') {
      return parseArray();
    }
    if (c === '"') {
      return parseString();
    }
    if (c === 't') {
      return parseTrue();
    }
    if (c === 'f') {
      return parseFalse();
    }
    if (c === 'n') {
      return parseNull();
    }
    return parseNumber();
  };
  return parseValue();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文