[RESOLVIDO] Java e Arquivo JSon - A um Passo da loucura

Olá pessoal!!!
Estou ficando maluco com um a simples leitura e gravação de um arquivo JSon.
estou desde sábado tentando por isto para funcionar.
a muito tempo atrás fiz isto em JavaScript, mas, em JAVA tá trash.

tenho um arquivo JSon, chamado “Competidores.json”:

[
  {
    "id": "771",
    "nome": "Décio Rocha - Administrador",
    "apelido": "admin",
    "mostraApelido": "1",
    "estado": "10016",
    "cidade": "2850",
    "endereco": [
      "1",
      "2",
      "3",
      "4"
    ],
    "contatos": [
      "1",
      "2",
      "3",
      "4"
    ]
  },
  {
    "id": "772",
    "nome": "Décio Luiz Rocha",
    "apelido": "deciorocha",
    "mostraApelido": "1",
    "estado": "10016",
    "cidade": "3147",
    "endereco": [
      "1",
      "2",
      "3",
      "4"
    ],
    "contatos": [
      "1",
      "2",
      "3",
      "4"
    ]
  },
  {
    "id": "774",
    "nome": "Alexandre Cruzeiro",
    "apelido": "alexandrecruzeiro",
    "mostraApelido": "1",
    "estado": "10016",
    "cidade": "3147",
    "endereco": [
      "1",
      "2",
      "3",
      "4"
    ],
    "contatos": [
      "1",
      "2",
      "3",
      "4"
    ]
   }
]

Estou lendo o arquivo assim:

String jsonData = readFile("Competidores.json"); // Está na Raiz do aplicativo
JSONObject jobj = new JSONObject(jsonData);

Mas, não consigo tratar os dados.

Como consigo listar todos os dados deste arquivo???

Como fazer isto, afinal???

Olha, eu prefiro muito mais o Gson do google.

Que tratamento quer fazer?

Você entende que JSONObject e JSONArray são coisas diferentes, né?

Aqui tem um exemplo com Gson

1 curtida

Darlan, tudo bom???
Obrigado por responder.

Assim, até consigo ver o conteúdo, meu problema é que não consigo listar num for a totalidade do meu arquivo.
Eu preciso por este conteúdo em um vetor multidimensional (até aqui tudo bem).
Problema é que consigo ver o primeiro registro e só. Neste exemplo, meu arquivo tem 3 registros, onde o “id” são: 771, 772 e 774.
Eu pego o 771, mas, os outros não.

Tem mais uma coisa, nunca usei o GSon, uso o json-simple-1.1.1. Não sei se é muito diferente.

Peço desculpas, sou novato em Java e estou estudando na IFPR - Umuarama; o que estamos vendo lá é muito mais básico do que minha pergunta.

Pra ler um Object:

public void lerJson() {
    JSONObject jsonObject;
    JSONParser parser = new JSONParser();
    try {
        try (FileReader f = new FileReader(arquivo)) {
            jsonObject = (JSONObject) parser.parse(f);
        }
        nome = (String) jsonObject.get("nome");
        km = (String) jsonObject.get("km");
        carro = (String) jsonObject.get("carro");
        data = (String) jsonObject.get("data");
        hora = (String) jsonObject.get("hora");
    } catch (FileNotFoundException e) {
    } catch (IOException | org.json.simple.parser.ParseException e) {
    }
}

Como o darlan citou, o seu JSON é de Array e não de Object

1 curtida

Abner, tudo bem???
obrigado por responder!!!
ainda tenho muitas dificuldades para entender a ideia de objeto e array, neste caso, principalmente.
Não nego minha incapacidade e por isto peço ajuda.

Como vcs acham que deveria ser meu arquivo json???
O problema é o json ou o modo como quero programar no java???

Obrigado!!!

Deciorocha, tudo bem e você?

Vamos imaginar uma agenda:

(Simplificando)

Um JSON Object teria somente um contato.
Agora um JSON Array, seriam varios contatos salvos em uma lista.

Depende da sua necessidade, se você precisa guardar vários “contatos” em sua lista, você deve usar um JSON Array, agora se quer guardar somente um “contato”, usa o Object.

(Só lembrando que contato é só um exemplo, vc pode guardar qualquer informação dentro de um array).

1 curtida

vamos la

a maioria dos formatos de serialização de dados como xml, json, etc, vc tem duas formas de analisar

  1. mapeamento de objetos, vc vai ler TODO o arquivo e todas as estruturas ali definidas vão virar objetos
  2. streaming: onde vc lê um arquivo passo a passo e vai ignorando ou processando os objetos que vc deseja

a primeira usa mais memoria, porém vc precisa entender o seguinte: o tipo de dado que um Json armazena pode não ser exatamente o que vc espera quando vc analisa a partir de uma linguagem de programação. existe uma especificação que diz como um inteiro é representado, como uma string é representada, etc, e não é pq vc tem atributos “nome” e “idade” que vc consegue gerar uma “pessoa” disso.

xml é ainda pior pois vc tem uma estrutura em arvore e pode ter elementos repetidos que fazem sentido semanticamente, mas no Java ou Perl podem não fazer sentido imediato.

json não possui uma especificação formal de schema como o xml possui ( via xsd se não me engano ). então vc tem que fazer muito if/else se quiser processar um arquivo que não foi produzido pela mesma aplicação.

é tentador olhar e pensar “ah sempre vai vir essa estrutura, esse campo, etc” e ai do nada ao inves de um booleano vem um numero. ou uma string. ou qualquer outra coisa.

é a vida. agora senta na cadeira e vai estudando essa parada ai.

1 curtida
import java.io.BufferedReader;
import org.json.JSONArray;
import org.json.JSONObject;
 
public class ReadJson {
    
    JSONObject js = null;
    JSONArray ja = null;
    
    public ReadJson() {
        try { 
            
            // dependendo da biblioteca da' pra otimizar essa parte
           // *************************
                java.io.FileReader fr = new java.io.FileReader("Competidores.json");
                java.io.BufferedReader br = new BufferedReader(fr);
               StringBuilder sb = new StringBuilder(); 
               String line;
               while((line = br.readLine()) != null){
                   sb = sb.append(line);
               }
           
              br.close();
              fr.close();
           // ********************************
            
            // dentro do seu json  ele começa com uma Array entao você trata ela primeiramente
            // **************************************
            ja = new JSONArray(sb.toString());
            
            for( int x=0; x < ja.length(); x++)  {
               JSONObject ob = ja.getJSONObject(x);
               String id = ob.getString("id");
               String nome = ob.getString("nome");
               String apelido = ob.getString("mostraApelido");
               String estado = ob.getString("estado");
               String cidade = ob.getString("cidade");                
               
               System.out.println(
                   "id = " + id + "\n" +
                   "nome = " + nome + "\n" +
                   "apelido = " + apelido + "\n" +
                   "estado =  " + estado + "\n" +
                   "cidade = " +  cidade + "\n"
               );
               
               System.out.println("endereco");
               // outra array 
               JSONArray aends =  ob.getJSONArray("endereco");
               for( int z=0; z < aends.length(); z++) {
                  String s = aends.getString(z);
                  System.out.println(" " + s);
               }
               
               System.out.println("contatos");
              // outra array
               JSONArray acontatos =  ob.getJSONArray("contatos");
               for( int z=0; z < acontatos.length(); z++) {
                  String s = acontatos.getString(z);
                  System.out.println(" " + s);
               }
               
               System.out.println("*****************************************************\n");
               
            }

        }catch(Exception e) {
            e.printStackTrace();
        }
        
        
    }
    
    
    public static void main(String[] args) {
        ReadJson rj = new ReadJson();
       
    }
}

Se não entendeu alguma coisa, lança a pergunta.

Bons Codigos.

1 curtida

Olá, peczenyj, obrigado por responder!!!

Vi seu comentário e sinceramente não conseguiu obter a informação que queria.
O que preciso é simples, entender como o JSON navega por entre os registros.
Entender como isto funciona através de exemplos seria um modo mais fácil e providencial de ajudar novatos como eu. Penso que esta seja a função de um fórum que pretende ajudar pessoas em uma determinada informação, a qual, este indivíduo tem dificuldade de compreender.
Todavia, penso que passar o código pronto não é o melhor método, a maioria das pessoas vai para um copy e cola e acabou. Mas, e este não é o meu caso.
Quando me passam um código inteiro, eu vou estudar, interpretar até obter entendimento sobre aquilo. Neste caso sim, passar um código inteiro é válido.

Não me leve a mal, mas, a informação que você passou é relevante para as pessoas que buscam a teoria. O meu caso e o de muitos que vem ao fórum buscar informação é entender na prática.
Antes de vir ao fórum eu busquei informações, procurei por exemplos, e tentei fazer na mão o código. A minha ignorância não me permitiu ter sucesso.

A sua informação mesmo tecnicamente sendo positiva, pouca valia trouxe para minha compreensão do problema em si.

Peço desculpas pelo modo direto como lhe digo isto, mas o que penso é que outros virão buscando informações e talvez, e só talvez, deixem de entender uma boa linguagem como é Java (porque já lhe dizem que Java é uma linguagem muito técnica) pq não conseguiu ter sua dificuldade esclarecida e o perderemos para uma outra linguagem qualquer.
Meu pedido, e peço desculpas novamente por estar sendo muito direto, é que auxilie dando exemplos não compondo matérias técnicas que não lhe levarão o programador com dificuldade a um aprendizado prático.

Desde já agradeço sua colaboração.

j-menezes, agradeço por responder!!!

Seu código me serviu como uma luva, exatamente isso que eu precisava e te agradeço pela ajuda prestada.
Eu já havia desistido de tentar entender como o Json navega entre os registros.
Ia terminar as outras partes do projeto para depois me preocupar em como ler e gravar as informações, pois estava tomando muito tempo meu e até atrapalhando o desenvolvimento do meu projeto.

Você mudou isso, muito obrigado.

1 curtida

Na verdade irei mais longe ainda, por todos os lugares em que passei e que vi que alguém com dificuldades, da mesma maneira que eu, não teve a sua resposta resolvida, vou repassar este link para ajudá-los a terem suas dificuldades resolvidos.
Pode parecer exagero, mas, por tudo que vi por onde andei, posso dizer com certeza que este Talvez seja o tópico mais importante relativo “Json com múltiplos registros” que já encontrei resolvido.

Muito obrigado a todos os participantes e quero deixar claro quê meu problema, a minha dúvida, ela foi totalmente resolvida.

Novamente obrigado, j-menezes.

Cara, isso é um problema seu.

vc chega num forum, posta mais codigo ( entre java e e json ) e perguntas to tipo:

Como consigo listar todos os dados deste arquivo???

isso é uma coisa totalmente abstrata. eu vou ter q entrar na sua cabeça pra entender o q vc quer dizer com “listar os dados”.

vc não investe tempo explicando a sua duvida e quando alguem investe tempo para te responder vc age assim. A minha resposta foi tão vaga quanto foi a sua duvida original.

quer que alguem te ajude? começa explicando melhor.

ou não explique e fique na esperança de alguem com tempo livre vir e te fazer as perguntas necessarias para entender qual é o problema e como resolver.

todo mundo aqui foi iniciante. vc quer deixar de ser um iniciante? repense suas atitudes.

1 curtida

Claro que é problema meu… não tenha dúvida disto.

quanto as perguntas, era esta a minha necessidade.

Se não ajuda, não atrapalha, pô.

Vc veio postando um monte de cacarecos que não tem nenhuma utilidade para a resolução do meu problema. Faça isto dentro de uma empresa e conheça mais cedo o RH.

Veja o que fez o j-menezes, se despiu de qualquer arrogância e me ajudou e muitoooooo!!!
Ele sabia a minha necessidade, provavelmente passou pelo que eu estou passando e num ato de total desapego, fez o código pra mim. Tem meu respeito e minha gratidão.

Não precisava chegar a tanto e por isto mesmo fiquei tão grato ao j-menezes.

Bom, importante que pessoas se importaram com o meu problema e tentaram me trazer a resolução dele… e conseguiram.

Penso que isto é a finalidade de fórum…

Então reveja o teu conceito de fórum.
A finalidade do fórum é discutir questões sobre desenvolvimento e tecnologia, não necessariamente apenas sobre java.

De mais a mais, a postura do @j-menezes foi a menos correta. Afinal, você não precisou se esforçar, não teve a necessidade de analisar o problema e entender que a solução nem sempre vem de uma única fonte (ou vem e a tua maneira de pesquisar precisa ser melhorada).

O processo de desenvolvimento necessita, antes de qualquer código ser criado, de planejamento e pesquisa. Se você não entende isso como necessário e acha que quem está no fórum ajudando tem a obrigação de responder da maneira que você quer e precisa, então, é hora de rever o que você entende por comunidade e fórum.

Não sei porque que eu tô apanhando nesse fórum como se fosse um boi dentro de uma roça? Fica a pergunta.

Este é meu ponto de vista sobre o que é um fórum e sua finalidade, não significa nem que eu estou certo e muito menos que você está, mas, talvez os dois estejam certos, ou estejam errados. Quem sabe??? Nem você nem eu somos os paladinos da verdade e a cada dia, vemos a verdade sendo alterada ou questionada. Quem me garante que você está certo??? Quem te garante que eu estou??

Às vezes parece que vocês não leram o que eu escrevi, em que agradeço ao Menezes por me ajudar, e até eu achei que foi demais o que ele fez.
Vale lembrar que eu não tô aqui pedindo ajuda para algum comando básico do Java. Estou aqui pedindo ajuda para alguma coisa que é um pouco mais complexa.

Antes de aparecer por aqui pedindo ajuda, vasculhei parte da internet atrás da informação, mas não achei aquilo que eu precisava.
Vim aqui postando apenas um arquivo de json, criado por mim, para que as pessoas entendessem as minhas dificuldades em relação as bibliotecas de json. Quem tivesse interesse me ajudasse e foi tentado a todo custo me ajudar.

Não sou nenhum ignorante, não cheguei aqui perguntando o que é sout, vim aqui por uma questão óbvia, não acho tal informação, de maneira conclusiva, que me resolva o problema e percorri vários sites, inclusive esse aqui mesmo, procurando a resolução do problema.

Se o ato que eu cometi é um crime, de pensar como pensei, peço que me digam e sairei do fórum.
Todavia, não penso que cometi qualquer crime e se, em algum momento fui ríspido demais, peço novamente desculpas. como já fiz anteriormente.

Eu também acho que é melhor ensinar a pescar do que dar o peixe pescado.

O que me causa estranheza é o fato de que nada fiz. Fui sim agraciado, por alguém que quis me ajudar e achou que me passando o código pronto me ajudaria, o qual, resolveu certinho minhas necessidades.
E mais, a solução foi tão abrangente, que eu tenho 2 combos para cidade-estado, que assim que tiver terminado, ziparei o código e postarei aqui, porque também não achei nada para Java sobre isso.

Sou um cara do tempo do Clipper, tenho os livros do Ramalho até hoje.
Aprendi a programar, erradamente é claro, em delphi 3, ainda no Windows 3.11.
Por mais de 20 anos estive fora desse mercado, voltei a estudar esse ano.

Para mim classes e métodos ainda são complexos. Meu professor nem chegou a isso ainda.

Vale lembrar, falo de Java porque eu estou estudando agora. Nunca disse que este fórum serve apenas para Java ou para qualquer outra linguagem, especificamente. Estou aqui porque este fórum é um dos melhores do Brasil em várias linguagens, Java é só uma delas.

Neste momento, estou me sentindo discutindo o sexo dos Anjos. Não penso que isso auxilia o fórum. Por isso, Esta é minha última postagem sobre este assunto.

Volto a dizer, se julgarem que o que eu fiz vale uma exclusão, Apenas me digam e me excluam.

Novamente e nem sei porquê peço desculpas se ofendi alguém ou se dei prejuízo para outrem.

Obrigado!!!

De nada, tchau.Michael-Jackson-Popcorn

1 curtida

Relaxa cara, faz parte… Se surgir dúvidas, não deixe de perguntar.

E como foi dito, todos já foram iniciantes, não há problema nenhum em perguntar.

Resumindo, toda ajuda é válida, sendo ela muito técnica ou não (não estou dizendo que você recusou ajuda de alguém). Só que pelo o que você respondeu, ficou parecendo que você estava procurando algo pronto. Mas faz parte, se surgir alguma dúvida, não hesite em perguntar.

Obs: Nem todos as suas dúvidas serão respondidas ou solucionadas assim, as vezes alguém só vai te dar um norte e provavelmente essa será a única resposta, e só vai restar você correr atrás. Então, boa sorte nos estudos!

1 curtida

Não sei da onde vc apareceu, mas, só pela sua frase de perfil, eu sei o que vc é…
por isto, vá de retro!!!

Ora, apenas por que eu citei Aleister Crowley eu tenho alguma relação com a religião Thelemita ou algo assim? Esse é um fórum de tecnologia, não é lugar para suas crenças religiosas ou o que quer que seja. Cito Alesteir Crowley NOVAMENTE: Faze o que tu queres há de ser o todo da Lei.

A mente extremamente fechada desse ser impede muita coisa. Dá pra entender o por quê não consegue entender algo simples. :wink:

Obrigado Abner.
Vc foi um dos primeiros a tentar me ajudar e me sinto triste pelo ocorrido.
Não estou aqui para prejudicar ninguém. Muito pelo contrário.