๐Ÿ“‹
โ† ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ

์ผ๋ฐ˜์ ์ธ JSON ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ยท ํƒœ๊ทธ: json, json-errors, json-validation, json-syntax, debugging, developer-tips

์ผ๋ฐ˜์ ์ธ JSON ์˜ค๋ฅ˜

JSON์˜ ์—„๊ฒฉํ•œ ๊ตฌ๋ฌธ ๊ทœ์น™์€ ๋‹จ ํ•˜๋‚˜์˜ ์ž˜๋ชป๋œ ๋ฌธ์ž๋ผ๋„ ์ „์ฒด ๋ฌธ์„œ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆด ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ JSON ์˜ค๋ฅ˜๋ฅผ ์ดํ•ดํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ๋””๋ฒ„๊น…ํ•˜๊ณ  ๋™์ผํ•œ ์‹ค์ˆ˜๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ๊ฒช๋Š” ๋ฌธ์ œ์™€ ๊ฐ๊ฐ์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์„ค๋ช… ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

1. ํ›„ํ–‰ ์‰ผํ‘œ

์˜ค๋ฅ˜: ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ๋์—์„œ Unexpected token

ํ›„ํ–‰ ์‰ผํ‘œ๋Š” JavaScript ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์—์„œ๋Š” ํ—ˆ์šฉ๋˜์ง€๋งŒ JSON์—์„œ๋Š” ์—„๊ฒฉํžˆ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค.

์œ ํšจํ•˜์ง€ ์•Š์€ JSON:

{
  "name": "Alice",
  "age": 30,
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ๋’ค์˜ ์‰ผํ‘œ๋ฅผ ์ œ๊ฑฐํ•˜์„ธ์š”.

{
  "name": "Alice",
  "age": 30
}

ํ›„ํ–‰ ์‰ผํ‘œ๊ฐ€ ์žˆ๋Š” ๋ฐฐ์—ด:

// ์œ ํšจํ•˜์ง€ ์•Š์Œ
[1, 2, 3,]

// ์œ ํšจํ•จ
[1, 2, 3]

2. ํ‚ค ์ฃผ์œ„์˜ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋”ฐ์˜ดํ‘œ

์˜ค๋ฅ˜: Unexpected identifier ๋˜๋Š” Expected double-quoted property name

JSON์€ ๋ชจ๋“  ๊ฐ์ฒด ํ‚ค๊ฐ€ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€๋”ฐ์˜ดํ‘œ์™€ ๋”ฐ์˜ดํ‘œ ์—†๋Š” ํ‚ค๋Š” JavaScript์—์„œ๋Š” ์ž‘๋™ํ•˜๋”๋ผ๋„ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํšจํ•˜์ง€ ์•Š์€ JSON:

{
  name: "Alice",
  'occupation': "Engineer"
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ํ•ญ์ƒ ํ‚ค๋ฅผ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์œผ์„ธ์š”.

{
  "name": "Alice",
  "occupation": "Engineer"
}

3. ๋ฌธ์ž์—ด ๊ฐ’์— ์ž‘์€๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ

์˜ค๋ฅ˜: Unexpected identifier ๋˜๋Š” Unterminated string

ํ‚ค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ฌธ์ž์—ด ๊ฐ’๋„ JSON์—์„œ๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€๋”ฐ์˜ดํ‘œ๋Š” ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์œ ํšจํ•˜์ง€ ์•Š์€ JSON:

{ "greeting": 'Hello, world!' }

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์ž‘์€๋”ฐ์˜ดํ‘œ๋ฅผ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๋ฐ”๊พธ์„ธ์š”.

{ "greeting": "Hello, world!" }

ํŒ: ๋ฌธ์ž์—ด์— ํฐ๋”ฐ์˜ดํ‘œ๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋ฐฑ์Šฌ๋ž˜์‹œ๋กœ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜์„ธ์š”: "He said, \"Hello\"".

4. ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ ํŠน์ˆ˜ ๋ฌธ์ž

์˜ค๋ฅ˜: Unexpected token ๋˜๋Š” Invalid character

JSON ๋ฌธ์ž์—ด์—์„œ๋Š” ํŠน์ • ๋ฌธ์ž๋ฅผ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ํฐ๋”ฐ์˜ดํ‘œ("), ๋ฐฑ์Šฌ๋ž˜์‹œ(\), ์ œ์–ด ๋ฌธ์ž.

์œ ํšจํ•˜์ง€ ์•Š์€ JSON:

{
  "path": "C:\Users\Documents\file.json",
  "quote": "He said "hello""
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋ฐฑ์Šฌ๋ž˜์‹œ์™€ ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•˜์„ธ์š”.

{
  "path": "C:\\Users\\Documents\\file.json",
  "quote": "He said \"hello\""
}

JSON ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค ์ „์ฒด ๋ชฉ๋ก

| ์‹œํ€€์Šค | ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž | |----------|-----------| | \" | ํฐ๋”ฐ์˜ดํ‘œ | | \\ | ๋ฐฑ์Šฌ๋ž˜์‹œ | | \/ | ์Šฌ๋ž˜์‹œ | | \b | ๋ฐฑ์ŠคํŽ˜์ด์Šค | | \f | ํผ ํ”ผ๋“œ | | \n | ์ค„ ๋ฐ”๊ฟˆ | | \r | ์บ๋ฆฌ์ง€ ๋ฆฌํ„ด | | \t | ํƒญ | | \uXXXX | ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž (์˜ˆ: รฉ๋Š” e) |

5. ์œ ํšจํ•˜์ง€ ์•Š์€ ์ˆซ์ž ํ˜•์‹

์˜ค๋ฅ˜: Unexpected number ๋˜๋Š” Invalid number

JSON์—๋Š” ์ˆซ์ž ํ˜•์‹์— ๋Œ€ํ•œ ํŠน์ • ๊ทœ์น™์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์•ž์— 0์„ ๋ถ™์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (01์€ ์œ ํšจํ•˜์ง€ ์•Š์Œ)
  • ๋‹จ์ผ ์•ž์ž๋ฆฌ 0์€ ์ˆซ์ž 0์—๋งŒ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค
  • ์ˆซ์ž๋Š” ๋’ค์— ์ ์„ ๋ถ™์ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (10.์€ ์œ ํšจํ•˜์ง€ ์•Š์Œ)
  • 16์ง„์ˆ˜, 8์ง„์ˆ˜, 2์ง„์ˆ˜ ํ˜•์‹์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

์œ ํšจํ•˜์ง€ ์•Š์€ JSON:

{
  "invalid1": 01,
  "invalid2": 10.,
  "invalid3": 0xFF,
  "invalid4": 1,000
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

{
  "valid1": 1,
  "valid2": 10.0,
  "valid3": 255,
  "valid4": 1000
}

6. ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’: undefined, NaN, Infinity

์˜ค๋ฅ˜: undefined, NaN, Infinity์— ๋Œ€ํ•œ Unexpected token

JavaScript์—๋Š” JSON์— ํ•ด๋‹นํ•˜๋Š” ํ‘œํ˜„์ด ์—†๋Š” ๊ฐ’๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ํŒŒ์‹ฑ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค:

์œ ํšจํ•˜์ง€ ์•Š์€ JSON:

{
  "undefinedVal": undefined,
  "notANumber": NaN,
  "infinity": Infinity
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์œ ํšจํ•œ JSON ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

{
  "undefinedVal": null,
  "notANumber": null,
  "infinity": 1.7976931348623157e+308
}

7. ์ถ”๊ฐ€ ์‰ผํ‘œ ๋˜๋Š” ๋ˆ„๋ฝ๋œ ์‰ผํ‘œ

์˜ค๋ฅ˜: Expected comma ๋˜๋Š” Unexpected token

JSON์˜ ์‰ผํ‘œ๋Š” ๋ชจ๋“  ํ‚ค/๊ฐ’ ์Œ๊ณผ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ๋’ค์— ๋‚˜ํƒ€๋‚˜์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๋ฝ๋œ ์‰ผํ‘œ (์œ ํšจํ•˜์ง€ ์•Š์Œ):

{
  "name": "Alice"
  "age": 30
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋ˆ„๋ฝ๋œ ์‰ผํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

{
  "name": "Alice",
  "age": 30
}

8. ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ ๋ฌธ์ œ

์˜ค๋ฅ˜: Maximum call stack size exceeded ๋˜๋Š” ํŒŒ์„œ ํƒ€์ž„์•„์›ƒ

๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ JSON(10๋‹จ๊ณ„ ์ด์ƒ)์€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ๋””๋ฒ„๊น…์„ ๋งค์šฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ตฌ์กฐ:

{
  "level1": {
    "level2": {
      "level3": {
        "level4": {
          "level5": {
            "level6": {
              "value": "too deep"
            }
          }
        }
      }
    }
  }
}

๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹: ๊ตฌ์กฐ๋ฅผ ํ‰ํƒ„ํ™”ํ•˜๊ฑฐ๋‚˜ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

{
  "users": {
    "alice": { "role": "admin" }
  },
  "permissions": {
    "admin": ["read", "write", "delete"]
  }
}

9. ๋ˆ„๋ฝ๋œ ์—ฌ๋Š” ์ค‘๊ด„ํ˜ธ ๋˜๋Š” ๋‹ซ๋Š” ์ค‘๊ด„ํ˜ธ

์˜ค๋ฅ˜: Expected ',' or '}' ๋˜๋Š” Unexpected end of JSON input

์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์ค‘๊ด„ํ˜ธ์™€ ๋Œ€๊ด„ํ˜ธ๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๋˜๋Š” ์ˆ˜๋™์œผ๋กœ ์ž‘์„ฑ๋œ JSON ํŒŒ์ผ์—์„œ JSON ์˜ค๋ฅ˜์˜ ์ผ๋ฐ˜์ ์ธ ์›์ธ์ž…๋‹ˆ๋‹ค.

์œ ํšจํ•˜์ง€ ์•Š์€ JSON:

{
  "name": "Alice",
  "items": [1, 2, 3
}

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋ชจ๋“  {์— ์ผ์น˜ํ•˜๋Š” }๊ฐ€, ๋ชจ๋“  [์— ์ผ์น˜ํ•˜๋Š” ]๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

{
  "name": "Alice",
  "items": [1, 2, 3]
}

ํ”„๋กœ ํŒ: JSON์„ ์ ์ ˆํžˆ ๋“ค์—ฌ์“ฐ๊ธฐํ•˜์—ฌ ์—ฌ๋Š” ๊ด„ํ˜ธ์™€ ๋‹ซ๋Š” ๊ด„ํ˜ธ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ผ์น˜์‹œํ‚ค์„ธ์š”. JSON ํฌ๋งทํ„ฐ๊ฐ€ ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JSON ์˜ค๋ฅ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•

  1. JSON ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ์‚ฌ์šฉ -- ๋ฌด๋ฃŒ JSON ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์— JSON์„ ๋ถ™์—ฌ๋„ฃ์–ด ์ฒซ ๋ฒˆ์งธ ์˜ค๋ฅ˜์˜ ์ •ํ™•ํ•œ ์ค„๊ณผ ์—ด์„ ํ™•์ธํ•˜์„ธ์š”.
  2. ์ ์ง„์ ์œผ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ -- ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ์˜ ๊ฒฝ์šฐ ํ•œ ์„น์…˜์”ฉ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ๊ฒฉ๋ฆฌํ•˜์„ธ์š”.
  3. ๋ณต์‚ฌ-๋ถ™์—ฌ๋„ฃ๊ธฐ ์•„ํ‹ฐํŒฉํŠธ ์ฃผ์˜ -- ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ž, ์Šค๋งˆํŠธ ๋”ฐ์˜ดํ‘œ, ์ค„ ๋ฐ”๊ฟˆ ์—†๋Š” ๊ณต๋ฐฑ์ด ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ๋‚˜ ์›น ํŽ˜์ด์ง€์—์„œ ๋ชฐ๋ž˜ ๋“ค์–ด์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  4. ๋ฌธ์ž ์ธ์ฝ”๋”ฉ ํ™•์ธ -- ํŒŒ์ผ์ด UTF-8๋กœ ์ €์žฅ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ์€ ๋ณด์ด์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ๋ฆฐํ„ฐ ์‚ฌ์šฉ -- json ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํฌํ•จ๋œ ESLint์™€ ๊ฐ™์€ ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ ์ค‘์— JSON ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋ƒ…๋‹ˆ๋‹ค.

๊ธฐ์–ตํ•˜์„ธ์š”: JSON ํŒŒ์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋งŒ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ๋‹ค์‹œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฌธ์„œ๊ฐ€ ํ†ต๊ณผํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์„ธ์š”. ์ €ํฌ JSON ํฌ๋งทํ„ฐ & ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ ๋„๊ตฌ๋Š” ์ด ๊ณผ์ •์„ ๊ฐ€์†ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ฆ‰๊ฐ์ ์ด๊ณ  ์ƒ์„ธํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ JSON ๊ตฌ๋ฌธ ์˜ค๋ฅ˜ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• - CoolTool