Jump to content
Fivewin Brasil

Desabilitar ordenação do JSON com a hb_jsonencode()


alex2002

Recommended Posts

OIá pessoal, alguém sabe me informar qual parametro uso para que na codificação do Json (hb_jsonencode()) não ordene as tags e sim deixe na ordem da criação das mesmas?

Ex:

 

/////////////////////////////////////////////////////////////////////////

hJson                         := hash()
hJson['campo3']           := 'teste 3'
hJson['campo1']           := 'teste 1'
hJson['campo2']           := 'teste 2'

cJson := hb_jsonencode( hJson, .t. )

? cJson

resultado:

{
  "campo1" : "teste 1",
  "campo2" : "teste 2",
  "campo3" : "teste 3"
}

Sendo que eu queria que ocorresse assim: 

{
  "campo3" : "teste 3",
  "campo1" : "teste 1",
  "campo2" : "teste 2"
}

Ou seja, na sequência que eu inseri

 

tem mais algum parametro na função hb_jsonencode() ? Não achei a documentação da mesma nem a pau

Link to comment
Share on other sites

Fiz essa função a alguns anos, antes de conhecer a padrão do xHarbour. Ela tem algumas limitações e não aconselho usar, a padrão da linguagem é a melhor, mas realmente se precisar que seja ordenado veja o que essa te ajuda.

No exemplo abaixo o resultado é exatamente o q vc pediu

 

#define CRLF Chr(13)+Chr(10)

Function u_Teste()
Local hJson := Hash()
Local cJSon
HSetAACompatibility(hJson,.t.)

hJson['campo3']           := 'teste 3'
hJson['campo1']           := 'teste 1'
hJson['campo2']           := 'teste 2'

cJSon := _u_HashToJson_OLD(hJson)
MsgStop(cJSon)

Return

Static Function _u_HashToJson_OLD(hPar)
Local cParam := "{"+CRLF
Local nI
Local nJ
Local uVal2
Local uVal
Local aKey
Local cKey
Local nRealPos

aKey := hGetKeys(hPar)
For nI:=1 to Len(aKey)
  If HGetAACompatibility(hPar)
    nRealPos := HaaGetRealPos( hPar, nI )
    cKey := HGetKeyAt( hPar, nRealPos )
  Else
    cKey := aKey[nI]
  EndIf
  
  uVal := hPar[cKey]
  If ValType(uVal)=="C"
    uVal := '"'+Alltrim(uVal)+'"'
  ElseIf ValType(uVal)=="N"
    uVal := Alltrim(Str(uVal))
  ElseIf ValType(uVal)=="D"
    uVal := '"'+DtoC(uVal)+'"'
  ElseIf ValType(uVal)=="A"
    uVal2 := "["+CRLF
    For nJ := 1 to Len(uVal)
      uVal2 += _u_HashToJson_OLD(uVal[nJ])
      If ! nJ == Len(uVal)
      uVal2 += ","
      EndIf
    Next
    uVal2+="]"+CRLF
    uVal := uVal2
  ElseIf ValType(uVal)=="H"  
    uVal := _u_HashToJson_OLD(uVal)
  ElseIf Empty(uVal)
    uVal := '""'
  EndIf
  cParam += '"'+cKey+'":'+uVal
  If ! nI == Len(aKey)
      cParam += ","
  EndIf
  cParam += CRLF
Next
cParam += '}'+CRLF
Return cParam
  

 

Link to comment
Share on other sites

Obrigado a todos, na verdade o problema não era o Json e sim o HASH() que de fato é ordenado. 
 

A função hb_jsonencode() não muda a ordenação. 

De fato para o server que vai receber o arquivo json tanto faz a ordem, mas como eu estava atrasado (ainda estou rsrsrsrs) fiz a geração na unha mesmo.

Obrigado aos amigos.

Jão, tudo tranquilo por aqui, e como estão as coisas por aí?

Link to comment
Share on other sites

3 minutos atrás, alex2002 disse:

Obrigado a todos, na verdade o problema não era o Json e sim o HASH() que de fato é ordenado. 
 

A função hb_jsonencode() não muda a ordenação. 

De fato para o server que vai receber o arquivo json tanto faz a ordem, mas como eu estava atrasado (ainda estou rsrsrsrs) fiz a geração na unha mesmo.

Obrigado aos amigos.

Jão, tudo tranquilo por aqui, e como estão as coisas por aí?

Estamos bem Alex, mas todo kgado de medo do vírus me pegar por trás e me phoder todo.... kkkkkkkkkkkkkk

Ken tem kú tem medo, né meu caro amigo Mineiro? Vamos torcer para essa pandemia do kpeta passar, ai marcamos um ENCONTRO DE FIVEWINNERS, para BEBER e Matar as saudades e botar as novidades em dia. Abraços e use máscara.

Link to comment
Share on other sites

Em 03/02/2021 at 14:47, kapiaba disse:

Estamos bem Alex, mas todo kgado de medo do vírus me pegar por trás e me phoder todo.... kkkkkkkkkkkkkk

Ken tem kú tem medo, né meu caro amigo Mineiro? Vamos torcer para essa pandemia do kpeta passar, ai marcamos um ENCONTRO DE FIVEWINNERS, para BEBER e Matar as saudades e botar as novidades em dia. Abraços e use máscara.

Também quero ir nesse encontro com os amigos dessa vez, o primeiro e último foi no segundo encontro realizado em guarulhos, há 15 ou 16 anos atrás poxa vida.

Link to comment
Share on other sites

11 horas atrás, betovsp disse:

Também quero ir nesse encontro com os amigos dessa vez, o primeiro e último foi no segundo encontro realizado em guarulhos, há 15 ou 16 anos atrás poxa vida.

Isso é óbvio né Beto? Vamos esperar passar, e ver se a "biba" do Vagner Wirts consegue um alvará para vir. Dessa vez, vou cobrar uma "taxa" simbólica para as brejas, pois se a pessoa marcar e não vier, fica no prejú e quem veio, não paga a conta. Que achas?

Link to comment
Share on other sites

4 horas atrás, kapiaba disse:

Isso é óbvio né Beto? Vamos esperar passar, e ver se a "biba" do Vagner Wirts consegue um alvará para vir. Dessa vez, vou cobrar uma "taxa" simbólica para as brejas, pois se a pessoa marcar e não vier, fica no prejú e quem veio, não paga a conta. Que achas?

Concordo plenamente.

Link to comment
Share on other sites

11 horas atrás, kapiaba disse:

Isso é óbvio né Beto? Vamos esperar passar, e ver se a "biba" do Vagner Wirts consegue um alvará para vir. Dessa vez, vou cobrar uma "taxa" simbólica para as brejas, pois se a pessoa marcar e não vier, fica no prejú e quem veio, não paga a conta. Que achas?

Fechado.

Link to comment
Share on other sites

4 horas atrás, betovsp disse:

Fechado.

Tamu junto. E ninguém pode dizer que eu enganei ou roubei, pois eu jogo limpo. Tá documentado aqui, Se vier bebe, se não vier, nós bebemos com o dinheiro dele. Mesmo porquê, não sou como o Crhistiano Silveira, que enganou todo mundo. Não tem coisa mais gostosa que ser limpo. Fui em vários encontros, e nunca paguei pohha nenhuma, os amigos ou o patrão pagava. Nem o meu primeiro FIVEWIN oficial, eu paguei, o GILMER me deu. Não tenho rabo preso com ninguém. Orgulho em conhecer os melhores, orgulho de permanecer até hoje com os melhores. Os melhores, estão comigo até hoje. Quem não prestava... Sefú... Abraços.

Link to comment
Share on other sites

Crhistiano, ótima oportunidade para começar a se redimir. Aproveite esse tempo de pandemia, e vá juntando verba. Em vez de gastar com brejas e vinhos caros, economize. Quando tudo isso passar, acho que você já terá uma boa verba. Quanto está sua dívida hoje, R$ 7.000,00 ?? Junte o que puder e na época do ENCONTRO DE FIVEWINNERS, você faz o depósito do que tiver juntando e todos beberão e comerão de graça. Seja Homem e comece a honrar as fraudas, sim? Abs.

Link to comment
Share on other sites

  • 4 weeks later...

Olá Alex,

Não sei se já resolveu o problema, mas existe uma configuração nas variáveis HASH para desativar a ordenação e mais algumas outras configurações.

Veja se o exemplo abaixo te ajuda:

function main

cls

hJson                     := hb_hash()

? hb_HCaseMatch( hJson, .T. )   // No Case Sensitive
? hb_HKeepOrder( hJson, .T. )    // No Alphabetical Order
? hb_HAutoAdd( hJson, .T. )       // Se permite inserir um novo elemento automaticamente.

hJson['campo3']           := 'teste 3'
hJson['campo1']           := 'teste 1'
hJson['campo2']           := 'teste 2'

cJson := hb_jsonencode( hJson, .t. )

? cJson

return NIL

 

Testado com Harbour 3.4

Rossine.

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...