Skip to content

wareset/json-force-parse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

json-force-parse

Parse JSON-like data that contains unescaped text, comments, and extra or missing commas.

Зачем?

Эта библиотека парсит JSONC, JSON5 и больше. Она обрабатывает неэкранированный текст, комментарии, а так же лишние или отсутствующие запятые. Это нужно для парсинга различных JSON подобных данных, а так же данных, которые были сгенерированы нейронными сетями и могут быть не совсем валидными.

Библиотека пока не выложена на npm, поэтому, для того чтобы ее поставить, нужно добавить в package.json что-то такое:

{
  "dependencies": {
    "json-force-parse": "github:wareset/json-force-parse"
  }
}

Пример:

import jsonParse from 'json-force-parse'

const data = `

{
  // inline comment
  /*
  block comment
  */

  strings: [ "double quotes", 'single quotes', without\\ quotes],
  unicode: \\u0048\\u0065\\u006C\\u006C\\u006F,
  hexcode: \\x77\\x6F\\x72\\x6C\\x64,

  'json5 text': 'Lorem ipsum \
dolor sit amet, \\
exercitation',

  // commas
  commas: [,,1,, true  null 5 你好世界 [,,]{ q: 1 w: 2 },,]

  // numeric
  numbers: [1, 0.0000, -0, NaN, -Infinity, -42e-10, -0x42]
}

/* incorrect block comment
`

// Необязательный второй параметр принимает функцию обработки.
// Она в точности соответствует работе в `JSON.parse` в Chrome
const reviver = function (key, value, source) {
  console.log(this, key, value, source)
  return value
}

const res = jsonParse(data, reviver)

// Результат:
res ===
  {
    strings: ['double quotes', 'single quotes', 'without quotes'],
    unicode: 'Hello',
    hexcode: 'world',

    'json5 text': 'Lorem ipsum dolor sit amet, exercitation',

    commas: [1, true, null, 5, '你好世界', [], { q: 1, w: 2 }],

    numbers: [1, 0, -0, NaN, -Infinity, -4.2e-9, -66],
  }

Обработка ошибок

Данные могут быть действительно невалидными. В этом случае будет выброшено исключение в виде объекта с информацией.

Примеры:

import jsonParse from 'json-force-parse'

// 1. Отсутствует закрывающая кавычка в конце строки
const json_1 = `[ 1 2 3 "text ]`
try {
  jsonParse(json_1)
} catch (e) {
  e ===
    {
      error: 'Missing closing quote',
      index: 8,
      slice: '[ 1 2 3 "',
      value: [1, 2, 3],
    }
}

// 2. Отсутствует закрывающая скобка в конце файла
const json_2 = `[ 1 2 3 "text"  `
try {
  jsonParse(json_2)
} catch (e) {
  e ===
    {
      error: 'Missing bracket at the end',
      index: 14,
      slice: '[ 1 2 3 "text" ',
      value: [1, 2, 3, 'text'],
    }
}

// 3. Неправильно закрыта скобка
const json_3 = `[ [1,2], [3,4}, [5,6] ]`
try {
  jsonParse(json_3)
} catch (e) {
  e ===
    {
      error: 'Incorrect closing bracket',
      index: 13,
      slice: '[ [1,2], [3,4}',
      value: [
        [1, 2],
        [3, 4],
      ],
    }
}

// 4. Отсутствует значение для ключа
const json_4 = `{ q: 1, w:  , e: 3, r: 4 }`
try {
  jsonParse(json_4)
} catch (e) {
  e ===
    {
      error: 'Key "w" without value',
      index: 12,
      slice: '{ q: 1, w:  ,',
      value: { q: 1 },
    }
}

// 5. Отсутствует ключ для значения
const json_5 = `{ q: 1, w: 2,  : 3, r: 4 }`
try {
  jsonParse(json_5)
} catch (e) {
  e ===
    {
      error: 'Value "3" without key',
      index: 18,
      slice: '{ q: 1, w: 2,  : 3,',
      value: { q: 1, w: 2 },
    }
}

// 6. Присутствует ключ в массиве
const json_6 = `[1, 2, q: 3, 4 ]`
try {
  jsonParse(json_6)
} catch (e) {
  e ===
    {
      error: 'Key "q" in the array',
      index: 11,
      slice: '[1, 2, q: 3,',
      value: [1, 2],
    }
}

License

MIT

About

Parse JSON-like data that contains unescaped text, comments, and extra or missing commas.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published