Como obter o JSON STRING da string dada

2

Eu tenho uma string abaixo. Eu só preciso pegar a primeira string JSON accountHeader (em negrito).

<START AdditionalInfo#:>[FormsGenerationServiceImpl::,  accountNumber:ABC07667 ,  [Source System Request  : {"Info":{"Holder": {"nameData": {"shortName": "McIntosh"}},**"accountHeader": {"a": "Y","b": "1","c": "4","draft": "P","e": "Y0000DU9","f": "T","g": "1"}**,"forms": {"maskSSN": "N","deliverForms": "G","selectedForms": {"T5": ["F10"],"T1": ["F1403"],"T2": ["F100001401"]}},"accountHeader": {"a": "Y","b": "1","c": "4","d": "HWA","draftRequestType": "P","e": "Y0000DU9","f": "T","g": "1"}}} ], null]<AdditionalInfo#: END>

Meu resultado deve ser

"accountHeader": {"a": "Y","b": "1","c": "4","draft": "P","e": "Y0000DU9","f": "T","g": "1"}
    
por ahamedirshad123 10.02.2014 / 16:17

1 resposta

1

Aqui estão algumas opções:

  1. Use grep com o sinalizador -o para imprimir apenas a parte correspondente da linha e filtrar com head para obter apenas a primeira correspondência:

    grep -o '"accountHeader[^}]*}' file.json | head -n1 
    

    A expressão regular procura por "accountHeader e pelo maior número possível de caracteres que não sejam } até o primeiro } . É basicamente o mesmo regex usado nas outras soluções abaixo também.

  2. Use sed com -n para suprimir a impressão e p após a substituição para imprimir apenas se a substituição tiver sido um sucesso. Então, substitua (remova) tudo menos o que você quer:

    sed -n  's/.*\("accountHeader[^}]*}\).*//p' file.json 
    
  3. Use Perl, o -l adiciona uma nova linha a cada chamada de print , o -n significa "processa cada linha do arquivo de entrada" e aplica o script fornecido por -e :

    perl -lne  '/.*("accountHeader[^}]*})/ && print $1' file.json 
    
  4. Use awk , isso pressupõe que ** em sua entrada de exemplo esteja lá para destacar a parte em que você está interessado e não existe realmente nos dados reais. Em caso afirmativo, isso deve funcionar:

    awk -F'},' '{print $2"}"}' file.json
    

Se o ** estiver realmente lá, as coisas são ainda mais simples, use-as como delimitadores de campo:

awk -F'**' '{print $2"}"}' file.json

ou

perl -F"\*\*" -alne 'print $F[1]' file.json
    
por 10.02.2014 / 16:35