Ao tentar criar uma mensagem JSON para uma API, me vi lutando para fazer algo que achava simples. Eu precisava criar uma mensagem como a seguinte:
{ "list": [ { "foo": 1, "bar": 2 } ] }
No entanto, minha primeira tentativa não funcionou:
say to-json { foo => [ { a => 1, b => 2 } ] };
# {"foo":[{"a":1},{"b":2}]}
Tentar simplificar as coisas me confundiu ainda mais:
say { foo => [ { a => 1 } ] };
# {foo => [a => 1]}
# Note that this is not JSON, but I expected to see curly braces
Então eu tentei usar algumas variáveis temporárias, e isso funcionou:
my @list = { a => 1 };
say to-json { foo => @list };
# {"foo":[{"a":1}]}
my %hash = ( a => 1 );
say to-json { foo => [ %hash ] };
# {"foo":[{"a":1}]}
O que está acontecendo aqui?
E existe uma maneira de conseguir a saída desejada sem uma variável temporária extra?
data-structures
raku
jja
fonte
fonte
say to-json { foo => [ { a => 1 } ] };
deve produzir algo como{"foo":[{"a":1}]}
, não{"foo":["a":1]}
. Este último é um erro de digitação, certo? Se não, o quesay $*PERL.compiler.version;
diz?say to-json { foo => [ a => 1 ] }
resultados,{"foo":[{"a":1}]}
para quem sabe o que eu digitei quando recebi, se é que eu já fiz. Foi mal!Respostas:
Você descobriu a regra do argumento único . Inúmeras construções em Raku irão repetir o argumento fornecido. Isso inclui o
[...]
compositor da matriz. É por isso que quando dizemos:Obtemos uma matriz que contém 10 elementos, não 1. No entanto, isso também significa que:
Itera o
[1,2]
, e, portanto, resulta em[1,2]
- como se a matriz interna não estivesse lá. AHash
itera para seus pares, assim:Realmente produz:
Ou seja, a matriz possui os pares. O serializador JSON, em seguida, serializa cada par como um objeto de um elemento.
A solução é produzir um elemento único iterável. O
,
operador infix é o que produz listas, para que possamos usar isso:Em seguida, o único argumento a ser iterado é uma lista de 1 elemento com um hash e você obtém o resultado desejado.
Maneira fácil de lembrá-lo: sempre use vírgulas finais ao especificar os valores de uma lista, matriz ou hash, mesmo com uma lista de elemento único, a menos que você esteja especificando a iterável única a partir da qual será preenchida.
fonte