Java 读取API和GSON类
我不熟悉JSON数据格式和java编程语言;因此,我找不到有效的答案。实际上,我必须阅读这个API,并从这个API中获得一些重要的内容。因此,我决定使用google的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
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知道它不是字符串的结尾,只是内容的一部分”
——许多库也接受双引号,但实际上这是不正确的,如果有api抱怨它们,那么api是正确的。
因此,您的有效负载应该看起来像{'brand':'Jeep','doors':3}
我的意思当然是相反的当您从api接收JSON输出时,可以直接使用该输出并对其进行反序列化。json字符串中不需要有转义字符。当您自己定义json字符串时,它们是必需的。例如
String s=“{\”当前用户\ url\“}”因为是编译器迫使您转义它。但作为API响应得到的json输出是在一个变量中的,如果变量的类型和分配给它的内容是相同的,那么编译器无法对此进行比较
现在,我只使用了您的代码,但使用了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对于较长的字符串,code>的效率非常低,因为对于每一个新行,它都需要复制所有以前的内容,然后向其中添加新行。看看谢谢你的帮助和解释。嗯,在阅读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());