Não consigo pegar campo JSON

Olá amigos, estou utilizando Java e as seguintes APIs: org.json e apache.common.
Quero pegar o valor “Rate”, do seguinte JSON:

{“query”:{“count”:1,“created”:“2017-10-26T15:04:29Z”,“lang”:“en-US”,“results”:{“rate”:{“id”:“EURBRL”,“Rate”:“3.8156”}}}}

Eu já tentei de diversos maneiras. Porém, o único campo que eu consigo pegar, é o campo “query”.

Segue meu código:

String jsonString = IOUtils.toString(url);
JSONObject generatedJson = new JSONObject(jsonString);
System.out.println(generatedJson.get("query"));

Consegui da seguinte forma:

		String jsonString = IOUtils.toString(url);
		JSONObject generatedJson = new JSONObject(jsonString);
		JSONObject generatedJson2 = generatedJson.getJSONObject("query");
		JSONObject generatedJson3 = generatedJson2.getJSONObject("results");
		JSONObject generatedJson4 = generatedJson3.getJSONObject("rate");
		System.out.println(generateJson4.get("Rate"));

Porém ficou ridiculo esse código, alguém com alguma idéia melhor?

Quando fizer uma postagem assim, em primeiro lugar informe a linguagem com que está tentando tratar o JSON

Tem toda razão.

Arrumado.

Sabe ali onde vc classificou como programação, o melhor seria classificar como Java, assim evita do pessoal que não entende de Java estar acessando

1 curtida

Por sinal nunca tratei JSON com Java, então não posso lhe ajudar, mas espero que consiga a ajuda

Nao acho que vai conseguir muito melhor que isso usando org.json

Eu costumo usar Gson, que facilita deserializar uma string json num objeto java. No seu exemplo, você poderia criar uma classe que seguisse a mesma hierarquia de propriedades do seu json.

Pode procurar também alguma lib que implemente jsonpath, que deve facilitar esse tipo de extraçao de um simples valor dentro de um json complexo.

Olá @AbelBueno,

Também estava usando GSON, mas não consegui serializar o objeto desse JSON.

Acho que para isso ser possível, eu teria que criar as classes:
Query, Results e Rate. Acho que isso só pioraria a situação, já que ficaria muito acoplado.

Eu nem diria acoplado, mas se você só precisa do Rate, eu acho meio desperdício mesmo.

Dá uma olhada nessa lib aqui: https://github.com/json-path/JsonPath
Acho que no seu caso pode facilitar isso.

Claro que se no seu sistema inteiro, essa é a única vez que vai fazer parse de um json pra pegar um único campo, melhor simplesmente usar seu código original.