Eu uso uma biblioteca JSON chamada JSONObject
(não me importo de mudar, se necessário).
Eu sei como iterar JSONArrays
, mas quando analiso dados JSON do Facebook, não recebo uma matriz, apenas a JSONObject
, mas preciso acessar um item por meio de seu índice, como JSONObject[0]
obter o primeiro, e eu não consigo descobrir como fazê-lo.
{
"http://http://url.com/": {
"id": "http://http://url.com//"
},
"http://url2.co/": {
"id": "http://url2.com//",
"shares": 16
}
,
"http://url3.com/": {
"id": "http://url3.com//",
"shares": 16
}
}
Respostas:
Talvez isso ajude:
fonte
JSONObject
são desordenadas e sua afirmação era um simples reflexo de uma implementação privada;)for (String key : keys)
para o meu caso, achei iterando os
names()
trabalhos bemfonte
Iterating
em Java, ele funciona muito bem! Obrigado.Evitarei o iterador, pois eles podem adicionar / remover objetos durante a iteração, também para uso de código limpo para loop. será simplesmente limpo e menos linhas.
Usando Java 8 e Lamda [Atualização em 02/02/2019]
Usando a maneira antiga [Atualização em 02/04/2019]
Resposta original
fonte
Não posso acreditar que não há solução mais simples e segura do que usar um iterador nestas respostas ...
O
names ()
método JSONObject retorna umaJSONArray
dasJSONObject
chaves, então você pode simplesmente caminhar por ele em loop:fonte
JSONObject
. Algo comoJSONObject object = new JSONObject ("{\"key1\",\"value1\"}");
. Mas não colocar json cru para ele, adicionar itens nele comput ()
método:object.put ("key1", "value1");
.fonte
jsonChildObject = iterator.next();
provavelmente deveria definirjsonChildObject
, tipoJSONObject jsonChildObject = iterator.next();
, não?Iterator<JSONObject>
dará um aviso. Eu o substituiria pelo genérico<?>
e faria uma chamada na chamada paranext()
. Além disso, eu usaria emgetString("id")
vez deget("id")
economizar para fazer um elenco.O org.json.JSONObject agora possui um método keySet () que retorna um
Set<String>
e pode ser facilmente repetido com um for-each.fonte
Primeiro coloque isso em algum lugar:
Ou se você tiver acesso ao Java8, apenas isto:
Em seguida, basta percorrer as chaves e os valores do objeto:
fonte
Eu criei uma pequena função recursiva que percorre todo o objeto json e salva o caminho da chave e seu valor.
fonte
Com Java 8 e lambda, mais limpo:
https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html#forEachRemaining-java.util.function.Consumer-
fonte
Usamos abaixo o conjunto de códigos para iterar sobre os
JSONObject
camposfonte
Certa vez, tive um json que tinha IDs que precisavam ser incrementados por um, uma vez que eram indexados a 0 e que estavam interrompendo o incremento automático do Mysql.
Portanto, para cada objeto que escrevi este código - pode ser útil para alguém:
uso:
isso pode ser transformado para funcionar também com JSONArray como objeto pai
fonte
A maioria das respostas aqui são para estruturas JSON planas, caso você tenha um JSON que possa ter aninhado JSONArrays ou Nested JSONObjects, a complexidade real surgirá. O seguinte snippet de código cuida de um requisito comercial. Ele pega um mapa de hash e JSON hierárquico com JSONArrays e JSONObjects aninhados e atualiza o JSON com os dados no mapa de hash
Você deve observar aqui que o tipo de retorno disso é nulo, mas os objetos do sice são passados quando essa alteração é redirecionada para o chamador.
fonte
O código abaixo funcionou bem para mim. Por favor me ajude se o ajuste puder ser feito. Isso obtém todas as chaves mesmo dos objetos JSON aninhados.
fonte
Esta é outra solução funcional para o problema:
fonte