Чтение API и GSON Class - PullRequest
       29

Чтение API и GSON Class

0 голосов
/ 22 сентября 2018

Я новичок в формате данных JSON и языке программирования Java;следовательно, я не могу найти правильный ответ.На самом деле, я должен прочитать этот API https://www.doviz.com/api/v1/currencies/all/latest, и получить некоторые важные содержания из этого API.Поэтому я решил использовать класс GSON от Google и написал этот код.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Scanner;
import com.google.gson.Gson;


public class Main {

    public static void main( String[] args ) throws Exception{

        String line = "";
        String jsonString = "";
        URL myUrl = new   URL("https://www.doviz.com/api/v1/currencies/all/latest");
        BufferedReader reader = new BufferedReader( new InputStreamReader(myUrl.openStream()) );

        while( (line = reader.readLine()) != null ){
            System.out.println(line);
            jsonString += line;
        }
        reader.close();

        jsonString = jsonString.substring(1, jsonString.length() - 1);

        Gson gson = new Gson();
        Currency json = gson.fromJson(jsonString, Currency.class);
   }
}


public class Currency {

    public double getSelling(){
        return selling;
    }

    public double getBuyiing(){
        return buying;
    }

    public String getCode(){
        return code;
    }

    private double selling;
    private transient long update_date;
    private transient int currency;
    private double buying;
    private transient double change_rate;
    private transient String name;
    private transient String full_name;
    private String code;
}

Этот код вызывает ошибку, и, насколько я думаю, основная причина ошибок заключается в том, что я не помещаю обратную косую черту в строку сына, как это: "{\" brand \ ": \"Джип \ ", \" двери \ ": 3}"

What I am wondering is why we need to put these backslash ?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Когда вы получаете вывод JSON от API, вы можете напрямую использовать вывод и десериализовать его.Вам не нужно иметь escape-символы в строке json.Они необходимы, когда вы сами определяете строку json.Например, String s = "{\"current_user_url\"}";, потому что это компилятор, который заставляет вас избегать его.Но вывод json, который вы получаете как ответ API, находится в переменной, и если тип переменной и назначаемый ей контент совпадают, компилятор не может с этим справиться.

Теперь я использовалтолько ваш код, но использовал общедоступный API Github, и я могу десериализовать выходной JSON без какой-либо операции с выходной строкой, как, например, экранирование "" или изменение "" to ''.

class Github {
    private String current_user_url;
    private String authorizations_url;

    public String getCurrent_user_url() {
        return current_user_url;
    }
    public void setCurrent_user_url(String current_user_url) {
        this.current_user_url = current_user_url;
    }
    public String getAuthorizations_url() {
        return authorizations_url;
    }
    public void setAuthorizations_url(String authorizations_url) {
        this.authorizations_url = authorizations_url;
    }
}

public static void main(String[] args) throws IOException, ClassNotFoundException {

        String line = "";
        String jsonString = "";
        URL myUrl = new   URL("https://api.github.com");
        BufferedReader reader = new BufferedReader( new InputStreamReader(myUrl.openStream()) );

        while( (line = reader.readLine()) != null ){
            //System.out.println(line);
            jsonString += line;
        }
        reader.close();

        System.out.println(jsonString);


        Gson g = new Gson();
        Github gi = g.fromJson(jsonString, Github.class);
        System.out.println(gi.getAuthorizations_url());
        System.out.println(gi.getCurrent_user_url());
}

Я также определилДжонс сам натянул и десериализировал его с помощью GSON.В этом случае при определении строки json мне нужно было избегать двойных кавычек, как показано ниже:

String s = "{\"current_user_url\":\"http://test.com/user\"}";

Gson g = new Gson();
Github gi = g.fromJson(s, Github.class);
System.out.println(gi.getCurrent_user_url());

Кроме того, строки JSON должны содержать только double quotes, и если вы используете single quotes, вы можете получитьошибка.

0 голосов
/ 22 сентября 2018

Следует упомянуть 2 вещи.

  1. Символ " является разделителем строк.Строка начинается с отметки " и заканчивается следующей.(При его явной инициализации, без использования других переменных) Если вы хотите включить символ " в вашу строку, вам нужно экранировать его как \" - поэтому Java знает, что это не конец строки, а только частьсодержания.

  2. В JSON вы должны использовать одинарные кавычки ' - многие библиотеки также принимают двойные кавычки, но на самом деле это неверно, и если какой-либо API-интерфейс жалуется наих API правильно.Таким образом, ваша полезная нагрузка должна выглядеть как {'brand': 'Jeep', 'doors': 3} Я имею в виду, конечно, наоборот.

...