39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict'
 | |
| 
 | |
| module.exports = parseJson
 | |
| function parseJson (txt, reviver, context) {
 | |
|   context = context || 20
 | |
|   try {
 | |
|     return JSON.parse(txt, reviver)
 | |
|   } catch (e) {
 | |
|     if (typeof txt !== 'string') {
 | |
|       const isEmptyArray = Array.isArray(txt) && txt.length === 0
 | |
|       const errorMessage = 'Cannot parse ' +
 | |
|       (isEmptyArray ? 'an empty array' : String(txt))
 | |
|       throw new TypeError(errorMessage)
 | |
|     }
 | |
|     const syntaxErr = e.message.match(/^Unexpected token.*position\s+(\d+)/i)
 | |
|     const errIdx = syntaxErr
 | |
|     ? +syntaxErr[1]
 | |
|     : e.message.match(/^Unexpected end of JSON.*/i)
 | |
|     ? txt.length - 1
 | |
|     : null
 | |
|     if (errIdx != null) {
 | |
|       const start = errIdx <= context
 | |
|       ? 0
 | |
|       : errIdx - context
 | |
|       const end = errIdx + context >= txt.length
 | |
|       ? txt.length
 | |
|       : errIdx + context
 | |
|       e.message += ` while parsing near '${
 | |
|         start === 0 ? '' : '...'
 | |
|       }${txt.slice(start, end)}${
 | |
|         end === txt.length ? '' : '...'
 | |
|       }'`
 | |
|     } else {
 | |
|       e.message += ` while parsing '${txt.slice(0, context * 2)}'`
 | |
|     }
 | |
|     throw e
 | |
|   }
 | |
| }
 |