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
string
La cadena a parsear como JSON. Ver el objeto JSON para una descripción de la sintaxis JSON. - ¿reviver?
Function() | null
Por 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 = false
Si 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:
-
Boolean
tipo -
String
tipo
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
object
the target object - source?
object
el 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 CommentArray
s.
Se podría acceder al constructor de CommentArray
por:
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
.