Parear y encadenar JSON con comentarios. Retendrá los comentarios incluso después de guardarlos!
- Parse las cadenas JSON con comentarios en objetos JavaScript y MANTENGA los comentarios
- soporta los comentarios en todas partes, sí, en TODAS partes en un archivo JSON, eventualmente 😆
- fija el problema conocido sobre los comentarios dentro de las matrices.
- Cordena los objetos en cadenas JSON con comentarios si los hay
El uso de comment-json es exactamente el mismo que el del objeto vainilla JSON.
Tabla de contenidos
- Por qué y cómo
- Uso y ejemplos
- Referencia a la API
- parse
- cadenar
- asignar
- CommentArray
Cambiar registros
¿Por qué?
Hay muchas otras bibliotecas que pueden tratar con JSON con comentarios, como json5, o strip-json-comments, pero ninguna de ellas puede encadenar el objeto analizado y devolver una cadena JSON igual que el contenido original.
Imagina que si la configuración del usuario se guarda en ${library}.json, y el usuario ha escrito un montón de comentarios para mejorar la legibilidad. ¡Si la biblioteca library necesita modificar la configuración del usuario, como la modificación de algunos valores de la propiedad y la adición de nuevos campos, y si la biblioteca utiliza json5 para leer la configuración, todos los comentarios desaparecerán después de ser modificados, lo que hará que la gente se vuelva loca.
Así que, si quieres analizar una cadena JSON con comentarios, modificarla, y luego guardarla de nuevo, comment-json es tu elección obligada!
¿Cómo?
comment-json analiza las cadenas JSON con comentarios y guarda los tokens de los comentarios en las propiedades de los símbolos.
Para las matrices JSON con comentarios, comment-json extiende el objeto vanilla Array en CommentArray cuyas instancias podrían manejar los cambios de los comentarios incluso después de que una matriz de comentarios sea modificada.
Instalar
$ npm i comment-json
Para los desarrolladores de TypeScript, @types/comment-json podría utilizarse
Desde 2.4.1, comment-json contiene declaraciones de typescript, por lo que también podría eliminar @types/comment-json.
Uso
paquete.json:
{// package name"name": "comment-json"}
Ordenar claves
Es un caso de uso común para ordenar las claves de un archivo JSON
Para más detalles sobre assign, ver aquí.
parse()
parse(text, reviver? = null, remove_comments? = false): object | string | number | boolean | null
- text
stringLa cadena a parsear como JSON. Ver el objeto JSON para una descripción de la sintaxis JSON. - ¿reviver?
Function() | nullPor defecto,null. Actúa igual que el segundo parámetro deJSON.parse. Si es una función, prescribe cómo se transforma el valor producido originalmente por el análisis sintáctico, antes de ser devuelto. - remove_comments?
boolean = falseSi es verdadero, los comentarios no se mantendrán, lo que se suele utilizar cuando queremos obtener un objeto limpio.
Devuelve object | string | number | boolean | null correspondiente al texto JSON dado.
Si el content es:
Y el valor de parsed será:
Hay OCHO tipos de propiedades de símbolos:
Y el valor de cada propiedad de símbolo es un array de CommentToken
interface CommentToken {type: 'BlockComment' | 'LineComment'// The content of the comment, including whitespaces and line breaksvalue: string// If the start location is the same line as the previous token,// then `inline` is `true`inline: boolean// But pay attention that,// locations will NOT be maintained when stringifiedloc: CommentLocation}interface CommentLocation {// The start location begins at the `//` or `/*` symbolstart: Location// The end location of multi-line comment ends at the `*/` symbolend: Location}interface Location {line: numbercolumn: number}
Parse en un objeto sin comentarios
console.log(parse(content, null, true))
Y el resultado será:
{foo: 1,bar:}
Casos especiales
const parsed = parse(`// comment1`)console.log(parsed === 1)// false
Si parseamos un JSON de tipo primitivo con remove_comments:false, entonces el valor de retorno de parse() será de tipo objeto.
El valor de parsed es equivalente a:
Que es similar para:
-
Booleantipo -
Stringtipo
Por ejemplo
const parsed = parse(`"foo" /* comment */`)
Que es equivalente a
Pero hay una excepción:
const parsed = parse(`// commentnull`)console.log(parsed === null) // true
stringify()
stringify(object: any, replacer?, space?): string
Los argumentos son los mismos que la vainilla JSON.stringify.
Y hace lo mismo que la vanilla, pero además trata con propiedades extra y las convierte en comentarios.
console.log(stringify(parsed, null, 2))// Exactly the same as `content`
space
Si no se especifica el espacio, o el espacio es una cadena vacía, el resultado de stringify() no tendrá comentarios.
Para el caso anterior:
console.log(stringify(result)) // {"a":1}console.log(stringify(result, null, 2)) // is the same as `code`
assign(target: object, source?: object, keys?: Array)
- target
objectthe target object - source?
objectel objeto de origen. Este parámetro es opcional pero es una tontería no pasar este argumento. - ¿claves?
Array<string>Si no se especifica, se utilizarán todas las propiedades propias enumerables desource.
Este método se utiliza para copiar las propiedades propias enumerables y sus correspondientes propiedades de símbolo de comentario al objeto destino.
Casos especiales sobre claves
Pero si se especifica el argumento keys y no está vacío, entonces el comentario before all, que no pertenece a ninguna propiedad, NO se copiará.
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// {// "bar": "baz",// // This is a comment// "foo": "bar"// }
Especificar el argumento keys como una matriz vacía indica que sólo copiará los símbolos no pertenecientes a propiedades de los comentarios
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// // before all// {// "bar": "baz",// }
Los símbolos no pertenecientes a propiedades incluyen:
Symbol.for('before-all')Symbol.for('before')Symbol.for('after-all')
CommentArray
Sección avanzada
Todas las matrices del objeto analizado son CommentArrays.
Se podría acceder al constructor de CommentArraypor:
const {CommentArray} = require('comment-json')
Si modificamos un array de comentarios, sus propiedades de símbolos de comentarios podrían manejarse automáticamente.
¡Oh sí! 😆
Pero atención, si reasignamos la propiedad de un array de comentarios con un array normal, todos los comentarios desaparecerán:
En su lugar, deberíamos:
Casos especiales sobre la coma final
Si tenemos una cadena JSON str
.