A Google abriu o código do Jsonnet, uma linguagem de configuração que substitui o JSON e adiciona novas funcionalidades sem quebra de compatibilidade com versões anteriores: comentários, referências, operadores aritméticos e condicionais, comprehension para matrizes e objetos, diretivas de importação, funções, variáveis locais, herança, dentre outras. Programas Jsonnet são convertidos para formatos de dados compatíveis com JSON.
Comentários: O Jsonnet aceita estilos de comentários nas notações das linguagens C (/* …. */) e C++ (//… ).
Referências: A palavra reservada self pode ser usada para referenciar o objeto corrente enquanto o operador $ referencia o objeto raiz.
Operadores Aritméticos e Condicionais: O operador + adiciona números, strings, matrizes e objetos. Os operadores == e != são avaliados como verdadeiro ou falso. A construção if funciona como o operador ternário ?: da linguagem C. A seguir estão algumas operações Jsonnet e código JSON resultante, obtido dos exemplos da linguagem:
// bar_menu.3.jsonnet
{
foo: 3,
bar: 2 * self.foo, // Multiplication.
baz: "The value " + self.bar + " is "
+ (if self.bar > 5 then "large" else "small") + ".",
array: [1, 2, 3] + [4],
obj: {a: 1, b: 2} + {b: 3, c: 4},
equality: 1 == "1",
}
{
"foo": 3,
"bar": 6,
"baz": "The value 6 is large.",
"array": [1, 2, 3, 4],
"obj": {a: 1, b: 3, c: 4},
"equality": false
}
Construindo Matrizes e Objetos: A construção for pode ser utilizada para construir matrizes e objetos como demonstrados no próximo exemplo:
{
foo: [1, 2, 3],
bar: [x * x for x in self.foo if x >= 2],
baz: { ["field" + x]: x for x in self.foo },
obj: { ["foo" + "bar"]: 3 },
}
{
"foo": [ 1, 2, 3 ],
"bar": [ 4, 9 ],
"baz": {
"field1": 1,
"field2": 2,
"field3": 3
},
"obj": { "foobar": 3 }
}
Modularidade: Com o Jsonnet o código pode ser separado em múltiplos arquivos que podem ser acessados usando a construção import. Os objetos importados são então concatenados utilizando o operador +.
Funções: Os valores de Jsonnet podem conter funções que são marcadas como campos ocultos e que não são traduzidos em JSON. Funções são utilizadas para avaliar diversas expressões. Um exemplo pode ser visto aqui.
O Jsonnet também permite a utilização de variáveis locais, uma forma de herdar objetos por meio de sua importação e utilização do operador de concatenação +, além de campos opcionais e campos calculados.
O Jsonnet é implementado em C++ 11 e disponibilizado em uma API C para facilitar a portabilidade para outras linguagens. Bibliotecas para C e Python estão disponíveis. A implementação C++ pode ser compilada para JavaScript com o Emscripten e um pacote nodejs não oficial foi disponibilizado.
Para maiores detalhes recomendamos conhecer a especificação da linguagem e a comparação com outras linguagens de configuração.