Manipular JSON enviado pelo POST [RESOLVIDO]

11 respostas
fabiojpoli

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

visola

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.

fabiojpoli

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!

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"
fabiojpoli
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!

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.

fabiojpoli

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:

fabiojpoli

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!

visola

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.

fabiojpoli

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!!

visola

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".

fabiojpoli

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