É possível não escapar de aspas duplas e obter o formato json correto?

0

Eu quero enviar dados do json usando httpie.

Se eu usar aspas duplas e escapar as aspas duplas ao redor da chave, funcionará.

json="[ \
    { \
        \"count\": 3 \
    } \
]"

echo $json

[{"count": 3}]

Mas eu não quero fugir. O seguinte é mais fácil de copiar e colar, mas não funciona.

json='[ \
    { \
        "count": 3 \
    } \
]'

echo $json

[\ {\ "count": 3 \} \]

Então, é possível não escapar das aspas duplas em torno da chave json, tornar mais fácil copiar de algum lugar e colar?

    
por metaphy 16.12.2016 / 10:50

2 respostas

2

Não é necessário que barras invertidas continuem entre aspas. No segundo exemplo, as contrabarras são ativamente prejudiciais, porque dentro de aspas simples elas serão mantidas como tal, tornando a string sintaticamente inválida. Apenas se livre das barras invertidas e isso funcionará.

    
por 16.12.2016 / 12:00
3

Em

var="foo\
bar"

A sequência \<newline> é especial entre aspas duplas, mas não entre aspas simples e é removida , portanto $var contém foobar .

Quando você está fazendo:

echo $json

Você está usando o operador split + glob (operador implícito invocado quando se esquece de citar uma expansão), ou seja, o conteúdo de $json é dividido nos caracteres em $IFS e cada palavra está sujeita ao nome do arquivo geração (aka globbing).

O valor padrão de $IFS contém tabulação de espaço e nova linha (e espaço, tabulação e nova linha também estão recebendo um tratamento especial com relação à divisão em que qualquer sequência contará como uma e as iniciais e finais serão ignoradas ). Então, por exemplo, em:

var='  foo  *
bar'

echo $var

$var é primeiro dividido em foo , * e bar (a parte divisão ) e * é expandido para a lista de arquivos não ocultos no atual diretório (a parte glob ).

Se você quisesse exibir o conteúdo como está (mas observe que muitas echo implementações podem mangle o conteúdo), você escreveria:

$ echo "$json"
[     {         "count": 3     } ]

Agora, se sua intenção é compactar o espaçamento, talvez você possa usar o operador split + glob a seu favor.

json='
  [
    {
      "count": 3
    }
  ]'

unset -v IFS # make sure we get a default splitting behaviour.
             # an unset -v IFS is equivalent to IFS=$' \t\n'
set -o noglob # disable the glob part

echo $json # use the split+glob operator

echo exibe seus argumentos separados por espaços para que cada seqüência de espaço, tabulação ou caractere de nova linha seja substituída por um único caractere de espaço (exceto os iniciais e posteriores que serão removidos e echo adiciona um caractere de nova linha no final). Então você vai ter:

[ { "count": 3 } ]

Em qualquer caso, isso não discriminará se os espaços em branco estão entre aspas ou não, portanto, pode alterar o significado dos dados do json ( "foo bar" seria transformado em "foo bar" , por exemplo).

Se você quiser usar a seqüência \<newline> para escapar (remover) os caracteres de nova linha, mas mantenha os outros caracteres em branco enquanto não tiver que escapar dos caracteres de aspas duplas, você pode usar um aqui-documento:

json=$(cat <<EOF
  [\
    {\
      "count": 3\
    }\
  ]
EOF
)
echo "$json"

O que daria:

  [    {      "count": 3    }  ]

(as novas linhas foram removidas (você poderia ter optado por preservar algumas delas, não prefixando-as com uma barra invertida), mas os outros caracteres em branco foram deixados intactos).

    
por 16.12.2016 / 12:04