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.