Manipular JSON enviado pelo POST [RESOLVIDO]

11 respostas
F

Olá pessoal, estou enviando via post o seguinte json:

[
  {
    "type": "numeric",
    "comparison": "lt",
    "value": 2,
    "field": "id"
  },
  {
    "type": "numeric",
    "comparison": "gt",
    "value": 3,
    "field": "id"
  },
  {
    "type": "string",
    "value": "cli",
    "field": "nome"
  },
  {
    "type": "list",
    "value": [
      1,
      2
    ],
    "field": "tipo"
  }
]

Como posso manipular esses valores em um for? Seja transformando esses JSON em objeto ou em uma Lista.

Preiso colocar estes valores no Where da consulta SQL.

Estou utilizando o JSON lib, que pelo que parece possui esta funcionalidade, mas não estou sabendo utilizar.

Obrigado!

11 Respostas

V

Você pode parsear o JSON na mão ou usar o Jackson JSON Processor que faz esse trabalho para você. No tutorial deles mostra como você usa.

F

Parece ser ótimo, mas como não estou familiarizado com essa lib, não sei quais .jar não necessários incluir (import) para que funcione. Sabe me dizer?

Obrigado!

V

Só o que você baixa no site mesmo. Ele não tem dependência com mais nada.

No seu caso, pode usar o método readTree do ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
JsonNode dados = mapper.readTree(stringComJsonAqui);

// Pega o quarto elemento do array
JsonNode quarto = dados.get(3);
System.out.println(quarto.get("type").getValueAsText()); // imprime "list"
F
visola:
Só o que você baixa no site mesmo. Ele não tem dependência com mais nada. No seu caso, pode usar o método readTree do ObjectMapper:
ObjectMapper mapper = new ObjectMapper();
JsonNode dados = mapper.readTree(stringComJsonAqui);

// Pega o quarto elemento do array
JsonNode quarto = dados.get(3);
System.out.println(quarto.get("type").getValueAsText()); // imprime "list"

Ótimo exemplo, vou testar aqui. Me desculpe a ignorancia, mas acho q n encontrei o link direto para baixar o .jar. Baixei o projeto, mas são muitos arquivos, n sei qual incluir, por exemplo:

Qual arquivo coloco na pasta WebContent/WEB-INF/lib

e

Como importo na jsp a lib? Exemplo:
<%@page import="net.sf.json."%>

Muito obrigado!

V

Pode baixar deste link e incluir direto no WEB-INF/libs

Na API você encontra as classes e aí é só adicionar os imports dos pacotes.

F

visola:
Pode baixar deste link e incluir direto no WEB-INF/libs

Na API você encontra as classes e aí é só adicionar os imports dos pacotes.

Muito Obrigado pela grande ajuda visola, funcionou perfeitamente.

<%@page import="org.codehaus.jackson.map.ObjectMapper"%> <%@page import="org.codehaus.jackson.JsonNode"%>

Abraços! :wink:

F

Só mais uma coisa, tem uma situação, em que meu json está assim:

[ { "type": "list", "value": [ 1, 2 ], "field": "tipo" } ]

Eu preciso manipular esses “value”, mas o problema é que esse value é dinamico, as vezes vem [1,2], as vezes [1], ou [1,2,3] , etc.

O que preciso é:

  • o tamanho disso ([2,1,4] => tamanho = 3 (quantidade de elementos))
  • percorrer esses valores, em um for, pois preciso utilizar contador.

Tentei de varias formas, mas sem sucesso, inclusive esta:

Mas ele me retorna um iterator, onde n consigo pegar o tamanho dele, nem percorre-lo.

Obrigado!

V

O JsonNode implementa Iterable. Tudo que implementa esta interface no Java 5 pode ser colocado dentro de um for avançado. Veja o seguinte:

for (JsonNode value : valuesNode) { // aqui ele sabe quantos elementos tem, não precisa se preocupar
   // usa value aqui como um JsonNode normal
}

Se quiser, também pode usar o Iterator num for comum:

for (Iterator<JsonNode> iterator = valuesNode.iterator(); iterator.hasNext();) { // não esqueça do último ponto e vírgula dentro do parênteses
    JsonNode value = iterator.next();
   // usa value aqui como um JsonNode normal
}

Estas são duas maneiras simples de se usar um Iterator sem poluir o escopo com nomes comuns.

F

Até aí beleza cara, mas eu preciso de uma informação. Preciso saber qual o primeiro momento que ele entra no for e qual a ultima vez que ele entra no for, por isso pensei em usar um for com contador. ou saber o tamanho do JsonNode (quantidade de valores no campo value do json). Queria algo assim mais ou menos:

Iterator<JsonNode> arrIdTipo = filter.get(i).get("value").getElements();
		        for (int x = 0; x < 2(ISSO DEVE SER DINAMICO) ; x++){ // Percorre o array que possui as opções selecionadas
		        	out.println(arrIdTipo.next());
		        	if(x == 0) // Se primeira vez do for, inicia a condição e abre parenteses
		            	where += " AND (idTipo = " + arrIdTipo.next().get(x);
			        else // Se não, continua incluindo mais opções selecionadas
			        	where += " OR idTipo = " + arrIdTipo.next().get(x);
			
                    if(x == (arrIdTipo.next().size() - 1)) // Se ultima vez que está passando dentro do for, fecha parenteses
                    	where += ")";
                }

Obrigado!!

V

Ah… foi mal. Pensei em mencionar no último post mas acabei esquecendo.
JsonNode também tem um método size que retorna, no caso de um array, a quantidade de elementos. Então você poderia usá-lo da seguinte forma:

for (int x = 0; x &lt; nodeValues.size() ; x++){ // Percorre o array que possui as opções selecionadas
   if(x == 0) // Se primeira vez do for, inicia a condição e abre parenteses
      where += " AND (idTipo = " + nodeValues.get(x);
   else // Se não, continua incluindo mais opções selecionadas
      where += " OR idTipo = " + nodeValues.get(x);
		
   if(x == (nodeValues.size() - 1)) // Se ultima vez que está passando dentro do for, fecha parenteses
      where += ")";
}

Onde nodeValues é o JsonNode correspondente ao campo "values".

F

Perfeito visola. Funcionou perfeitamente.

Não sei no que eu estava pensando qndo nao peguei diretamente ele ao inves de atribuir a um iterator.

Problema totalmente resolvido.

Obrigado!

Criado 10 de fevereiro de 2011
Ultima resposta 14 de fev. de 2011
Respostas 11
Participantes 2