Java 读取API和GSON类

Java 读取API和GSON类,java,json,gson,json-deserialization,Java,Json,Gson,Json Deserialization,我不熟悉JSON数据格式和java编程语言;因此,我找不到有效的答案。实际上,我必须阅读这个API,并从这个API中获得一些重要的内容。因此,我决定使用google的GSON类,并编写了这段代码 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.net.URL; import java.util.Scanner; import c

我不熟悉JSON数据格式和java编程语言;因此,我找不到有效的答案。实际上,我必须阅读这个API,并从这个API中获得一些重要的内容。因此,我决定使用google的GSON类,并编写了这段代码

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\”:“Jeep\”,“doors\”:3}”


我想知道的是,为什么我们需要放这些反斜杠?

有两件事要提

  • 字符是字符串分隔符。字符串从
    标记开始,在下一个标记结束。(在显式初始化时,不使用其他变量)如果要在字符串中包含
    字符,则需要像
    \”
    一样对其进行转义-以便Java知道它不是字符串的结尾,只是内容的一部分

  • 在JSON中,您应该使用单引号
    ——许多库也接受双引号,但实际上这是不正确的,如果有api抱怨它们,那么api是正确的。 因此,您的有效负载应该看起来像
    {'brand':'Jeep','doors':3}
    我的意思当然是相反的


  • 当您从api接收JSON输出时,可以直接使用该输出并对其进行反序列化。json字符串中不需要有转义字符。当您自己定义json字符串时,它们是必需的。例如
    String s=“{\”当前用户\ url\“}”
    现在,我只使用了您的代码,但使用了Github公共API,并且我能够反序列化输出json,而无需对输出字符串执行任何操作,例如转义
    ”或将
    ”更改为“

    我还自己定义了json字符串,并使用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字符串应仅包含
    双引号
    ,如果使用
    单引号
    ,则可能会出现错误。

    错误是什么?“此代码导致错误”您不能在问题中包含错误消息的任何原因?它是否包含一些敏感信息,如密码或其他信息?在这种情况下,您可以将它们替换为
    PASSWORD
    而不是真正的内容。顺便说一句
    jsonString+=line的效率非常低,因为对于每一个新行,它都需要复制所有以前的内容,然后向其中添加新行。看看谢谢你的帮助和解释。嗯,在阅读Yug的答案时,我注意到把单双引号的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());