返回介绍

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

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

2759. Convert JSON String to Object

中文文档

Description

Given a string str, return parsed JSON parsedStr. You may assume the str is a valid JSON string hence it only includes strings, numbers, arrays, objects, booleans, and null. str will not include invisible characters and escape characters. 

Please solve it without using the built-in JSON.parse method.

 

Example 1:

Input: str = '{"a":2,"b":[1,2,3]}'
Output: {"a":2,"b":[1,2,3]}
Explanation: Returns the object represented by the JSON string.

Example 2:

Input: str = 'true'
Output: true
Explanation: Primitive types are valid JSON.

Example 3:

Input: str = '[1,5,"false",{"a":2}]'
Output: [1,5,"false",{"a":2}]
Explanation: Returns the array represented by the JSON string.

 

Constraints:

  • str is a valid JSON string
  • 1 <= str.length <= 105

Solutions

Solution 1

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 和您的相关数据。
    原文