Как отправить Get запрос и парсить JSON на java?

Есть ссылка: http://www.cbr-xml-daily.ru/daily_json.js Перейдя по ней Вы увидите следующий код:

{
    "Date": "2020-03-07T11:30:00+03:00",
    "PreviousDate": "2020-03-06T11:30:00+03:00",
    "PreviousURL": "\/\/www.cbr-xml-daily.ru\/archive\/2020\/03\/06\/daily_json.js",
    "Timestamp": "2020-03-06T23:00:00+03:00",
    "Valute": {
        "AUD": {
            "ID": "R01010",
            "NumCode": "036",
            "CharCode": "AUD",
            "Nominal": 1,
            "Name": "Австралийский доллар",
            "Value": 44.8181,
            "Previous": 43.8478
        },
        "AZN": {
            "ID": "R01020A",
            "NumCode": "944",
            "CharCode": "AZN",
            "Nominal": 1,
            "Name": "Азербайджанский манат",
            "Value": 39.7981,
            "Previous": 39.0129
        },
        "GBP": {
            "ID": "R01035",
            "NumCode": "826",
            "CharCode": "GBP",
            "Nominal": 1,
            "Name": "Фунт стерлингов Соединенного королевства",
            "Value": 87.5972,
            "Previous": 85.399
        },
        "AMD": {
            "ID": "R01060",
            "NumCode": "051",
            "CharCode": "AMD",
            "Nominal": 100,
            "Name": "Армянских драмов",
            "Value": 14.0955,
            "Previous": 13.8174
        },
        "BYN": {
            "ID": "R01090B",
            "NumCode": "933",
            "CharCode": "BYN",
            "Nominal": 1,
            "Name": "Белорусский рубль",
            "Value": 30.1592,
            "Previous": 29.5946
        },
        "BGN": {
            "ID": "R01100",
            "NumCode": "975",
            "CharCode": "BGN",
            "Nominal": 1,
            "Name": "Болгарский лев",
            "Value": 38.8411,
            "Previous": 37.6417
        },
        "BRL": {
            "ID": "R01115",
            "NumCode": "986",
            "CharCode": "BRL",
            "Nominal": 1,
            "Name": "Бразильский реал",
            "Value": 14.6535,
            "Previous": 14.4352
        },
        "HUF": {
            "ID": "R01135",
            "NumCode": "348",
            "CharCode": "HUF",
            "Nominal": 100,
            "Name": "Венгерских форинтов",
            "Value": 22.5686,
            "Previous": 21.9037
        },
        "HKD": {
            "ID": "R01200",
            "NumCode": "344",
            "CharCode": "HKD",
            "Nominal": 10,
            "Name": "Гонконгских долларов",
            "Value": 86.8716,
            "Previous": 85.1741
        },
        "DKK": {
            "ID": "R01215",
            "NumCode": "208",
            "CharCode": "DKK",
            "Nominal": 1,
            "Name": "Датская крона",
            "Value": 10.1709,
            "Previous": 98.5239
        },
        "USD": {
            "ID": "R01235",
            "NumCode": "840",
            "CharCode": "USD",
            "Nominal": 1,
            "Name": "Доллар США",
            "Value": 67.5175,
            "Previous": 66.1854
        },
        "EUR": {
            "ID": "R01239",
            "NumCode": "978",
            "CharCode": "EUR",
            "Nominal": 1,
            "Name": "Евро",
            "Value": 75.8424,
            "Previous": 73.6842
        },
        "INR": {
            "ID": "R01270",
            "NumCode": "356",
            "CharCode": "INR",
            "Nominal": 100,
            "Name": "Индийских рупий",
            "Value": 91.8043,
            "Previous": 90.3555
        },
        "KZT": {
            "ID": "R01335",
            "NumCode": "398",
            "CharCode": "KZT",
            "Nominal": 100,
            "Name": "Казахстанских тенге",
            "Value": 17.6482,
            "Previous": 17.3795
        },
        "CAD": {
            "ID": "R01350",
            "NumCode": "124",
            "CharCode": "CAD",
            "Nominal": 1,
            "Name": "Канадский доллар",
            "Value": 50.4314,
            "Previous": 49.381
        },
        "KGS": {
            "ID": "R01370",
            "NumCode": "417",
            "CharCode": "KGS",
            "Nominal": 100,
            "Name": "Киргизских сомов",
            "Value": 96.6369,
            "Previous": 94.7167
        },
        "CNY": {
            "ID": "R01375",
            "NumCode": "156",
            "CharCode": "CNY",
            "Nominal": 10,
            "Name": "Китайских юаней",
            "Value": 97.2861,
            "Previous": 95.3392
        },
        "MDL": {
            "ID": "R01500",
            "NumCode": "498",
            "CharCode": "MDL",
            "Nominal": 10,
            "Name": "Молдавских леев",
            "Value": 38.8032,
            "Previous": 38.0376
        },
        "NOK": {
            "ID": "R01535",
            "NumCode": "578",
            "CharCode": "NOK",
            "Nominal": 10,
            "Name": "Норвежских крон",
            "Value": 72.8509,
            "Previous": 71.3605
        },
        "PLN": {
            "ID": "R01565",
            "NumCode": "985",
            "CharCode": "PLN",
            "Nominal": 1,
            "Name": "Польский злотый",
            "Value": 17.635,
            "Previous": 17.1518
        },
        "RON": {
            "ID": "R01585F",
            "NumCode": "946",
            "CharCode": "RON",
            "Nominal": 1,
            "Name": "Румынский лей",
            "Value": 15.7888,
            "Previous": 15.321
        },
        "XDR": {
            "ID": "R01589",
            "NumCode": "960",
            "CharCode": "XDR",
            "Nominal": 1,
            "Name": "СДР (специальные права заимствования)",
            "Value": 93.4388,
            "Previous": 91.4259
        },
        "SGD": {
            "ID": "R01625",
            "NumCode": "702",
            "CharCode": "SGD",
            "Nominal": 1,
            "Name": "Сингапурский доллар",
            "Value": 48.8443,
            "Previous": 47.7425
        },
        "TJS": {
            "ID": "R01670",
            "NumCode": "972",
            "CharCode": "TJS",
            "Nominal": 10,
            "Name": "Таджикских сомони",
            "Value": 69.7423,
            "Previous": 68.3663
        },
        "TRY": {
            "ID": "R01700J",
            "NumCode": "949",
            "CharCode": "TRY",
            "Nominal": 1,
            "Name": "Турецкая лира",
            "Value": 11.0945,
            "Previous": 10.874
        },
        "TMT": {
            "ID": "R01710A",
            "NumCode": "934",
            "CharCode": "TMT",
            "Nominal": 1,
            "Name": "Новый туркменский манат",
            "Value": 19.3183,
            "Previous": 18.9372
        },
        "UZS": {
            "ID": "R01717",
            "NumCode": "860",
            "CharCode": "UZS",
            "Nominal": 10000,
            "Name": "Узбекских сумов",
            "Value": 71.1384,
            "Previous": 69.7349
        },
        "UAH": {
            "ID": "R01720",
            "NumCode": "980",
            "CharCode": "UAH",
            "Nominal": 10,
            "Name": "Украинских гривен",
            "Value": 27.2248,
            "Previous": 26.7627
        },
        "CZK": {
            "ID": "R01760",
            "NumCode": "203",
            "CharCode": "CZK",
            "Nominal": 10,
            "Name": "Чешских крон",
            "Value": 29.8975,
            "Previous": 29.0618
        },
        "SEK": {
            "ID": "R01770",
            "NumCode": "752",
            "CharCode": "SEK",
            "Nominal": 10,
            "Name": "Шведских крон",
            "Value": 71.6815,
            "Previous": 69.7834
        },
        "CHF": {
            "ID": "R01775",
            "NumCode": "756",
            "CharCode": "CHF",
            "Nominal": 1,
            "Name": "Швейцарский франк",
            "Value": 71.6214,
            "Previous": 69.2026
        },
        "ZAR": {
            "ID": "R01810",
            "NumCode": "710",
            "CharCode": "ZAR",
            "Nominal": 10,
            "Name": "Южноафриканских рэндов",
            "Value": 43.3274,
            "Previous": 43.149
        },
        "KRW": {
            "ID": "R01815",
            "NumCode": "410",
            "CharCode": "KRW",
            "Nominal": 1000,
            "Name": "Вон Республики Корея",
            "Value": 56.8894,
            "Previous": 55.9575
        },
        "JPY": {
            "ID": "R01820",
            "NumCode": "392",
            "CharCode": "JPY",
            "Nominal": 100,
            "Name": "Японских иен",
            "Value": 63.777,
            "Previous": 61.7027
        }
    }
}

Нужно отправить Get запрос, а затем распарсить JSON.
Необходимо из этого получить значение доллара США и вывести его на экран. Самая большая проблема, с которой я сталкиваюсь при поиске информации - нигде не говорится, как выводить информацию выборочно (мне не нужно выводить информацию о других валютах, нужна информация только о долларе США)


Ответы (4 шт):

Автор решения: Дмитрий Мерцалов

Используйте http://www.jsonschema2pojo.org/ для преобразования полученного json в POJO.

    package com.example;

import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "ID",
        "NumCode",
        "CharCode",
        "Nominal",
        "Name",
        "Value",
        "Previous"
})
public class AMD {

    @JsonProperty("ID")
    private String iD;
    @JsonProperty("NumCode")
    private String numCode;
    @JsonProperty("CharCode")
    private String charCode;
    @JsonProperty("Nominal")
    private Integer nominal;
    @JsonProperty("Name")
    private String name;
    @JsonProperty("Value")
    private Double value;
    @JsonProperty("Previous")
    private Double previous;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("ID")
    public String getID() {
        return iD;
    }

    @JsonProperty("ID")
    public void setID(String iD) {
        this.iD = iD;
    }

    @JsonProperty("NumCode")
    public String getNumCode() {
        return numCode;
    }

    @JsonProperty("NumCode")
    public void setNumCode(String numCode) {
        this.numCode = numCode;
    }

    @JsonProperty("CharCode")
    public String getCharCode() {
        return charCode;
    }

    @JsonProperty("CharCode")
    public void setCharCode(String charCode) {
        this.charCode = charCode;
    }

    @JsonProperty("Nominal")
    public Integer getNominal() {
        return nominal;
    }

    @JsonProperty("Nominal")
    public void setNominal(Integer nominal) {
        this.nominal = nominal;
    }

    @JsonProperty("Name")
    public String getName() {
        return name;
    }

    @JsonProperty("Name")
    public void setName(String name) {
        this.name = name;
    }

    @JsonProperty("Value")
    public Double getValue() {
        return value;
    }

    @JsonProperty("Value")
    public void setValue(Double value) {
        this.value = value;
    }

    @JsonProperty("Previous")
    public Double getPrevious() {
        return previous;
    }

    @JsonProperty("Previous")
    public void setPrevious(Double previous) {
        this.previous = previous;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

Объект этого класса можете использовать для получения нужных вам данных.

→ Ссылка
Автор решения: Alex Krass

Пробовал гуглить, но каждый раз сбивает с толку то, что ни в одном примере, из тех, что я видел, не сказано, как работать с ссылкой, по которой расположен код

Это относится уже не к JSON преобразованиям, а работой с сетевыми запросами, в данном случае HTTP запрос на сервер и получение результата с него. Поэтому в примерах вы этого и не встречаете.

import java.io.*;
import java.net.*;

public class Test {
   public static String get(String urlString) throws Exception {
      URL url = new URL(urlString);
      URLConnection conn = url.openConnection();
      InputStream is = conn.getInputStream();

      StringBuilder result = new StringBuilder();
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));
      String line;
      while ((line = rd.readLine()) != null) {
         result.append(line);
      }
      rd.close();
      return result.toString();
   }

   public static void main(String[] args) throws Exception
   {
     System.out.println(get("http://www.cbr-xml-daily.ru/daily_json.js"));
   }
}
→ Ссылка
Автор решения: Freedom

Можно сделать так, метод 100% рабочий:

 public class MainActivity extends Activity {

            Button get;
            TextView answer;
        @Override

            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                get = findViewById(R.id.get);     
                answer = findViewById(R.id.answer);

        get.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                try {
                                    getHttpResponse();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
        }

         public void getHttpResponse() throws IOException {
         OkHttpClient client = new OkHttpClient().newBuilder()
          .build();
         Request request = new Request.Builder()
          .url("http://www.cbr-xml-daily.ru/daily_json.js")
          .method("GET", null)
          .addHeader("Cookie", "__cfduid=dc5403bef7ac2ab2cb8ead288d39f653e1586600122")
          .build();
          client.newCall(request).enqueue(new Callback() {
             // если запрос неудачный
                            @Override
                            public void onFailure(Call call, IOException e) {
              // в переменную mMessage получаем ответ
                               final String mMessage = e.getMessage().toString();
                               // Оборачиваем с помощью Runnable textView, т.к. okhttp вызывается в фоновом режиме, а изменение UI возможно только в UI-потоке
                                answer.post(new Runnable() {
                                    @Override
                                    public void run() {
               // Выводим текст в textView
                                        answer.setText(mMessage);
                                    }
                                });

                            }

        // В случае успешного запроса
                            @Override
                            public void onResponse(Call call, Response response) throws IOException {
               // в mMessage выводится полученный текст от сервера
                                String mMessage = response.body().string();

                                 try {
                                    JSONObject json = new JSONObject(mMessage);
                                    JSONObject json2 = json.getJSONObject("Valute");
                                    JSONObject json3 = json2.getJSONObject("USD");

                                    final String TranslationE = json3.getString("Value");

                 // Выводим значение
                                    answer.post(new Runnable() {
                                        @Override
                                        public void run() {
                                            answer.setText(TranslationE);
                                        }
                                    });

                                } catch (JSONException e) {
                                    //
                                }
        }
    }
→ Ссылка
Автор решения: Artur Vartanyan

Можно поработать через REST-запросы. Необходимо будет реализовать MVC. Необходимо будет создать контроллеры для POJO-классов и репозитории. Вот Вам официальный гайд(рекомендую читать анг.версию): https://spring.io/guides/tutorials/rest/

→ Ссылка