[英]How do I get json data from a URL without losing spaces in Java?
我正在学习Java,因此我决定尝试使用GW2,并希望编写一些有用的代码:API: http ://wiki.guildwars2.com/wiki/API: Main
我正在尝试获取以下数据: https : //api.guildwars2.com/v1/world_names.json转换为Java字符串,这是我的代码:
public static void main(String[] args) {
URL url = null;
String jsonData = "";
try {
url = new URL("https://api.guildwars2.com/v1/world_names.json");
InputStream is = url.openStream();
Scanner scan = new Scanner(is);
while(scan.hasNext()) {
jsonData += scan.next();
}
scan.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(jsonData);
}
问题是我丢失了字符串的格式(我缺少分隔单词的空白字符)。 如果您访问URL,就会看到以下内容:
[{“ id”:“ 1009”,“名称”:“阿斯彭伍德堡”},{“ id”:“ 1005”,“名称”:“ Maguuma”},{“ id”:“ 1008”,“名称” :“玉采石场”},
这是我在字符串中得到的:
{“ id”:“ 1009”,“名称”:“ FortAspenwood”},{“ id”:“ 1005”,“名称”:“ Maguuma”},{“ id”:“ 1008”,“名称”:“ JadeQuarry”}
我该如何解决? 难道我做错了什么?
我的最终目标是将这些数据转换为对象,然后能够向api请求一个特定的ID或NAME并获取更多数据,例如地图或事件,但首先要这样做,因为我正在学习无法正确获取字符串。
感谢您的阅读,
直接来自文档:
Scanner
使用定界符模式将其输入分为令牌,默认情况下,该模式与空格匹配。
您不需要任何类型的令牌化,因此您可以从Stupid Scanner技巧中借用一种代码:
final String jsonData = new Scanner(is).useDelimiter("\\A").next();
在一行中消耗了整个输入流。
注意,如果您坚持使用循环,则应该使用StringBuilder
而不是串联( jsonData += scan.next();
),因为该操作具有二次渐近运行时。
但是,我强烈建议您将Jackson用于现实世界中的所有JSON处理用途。
如我所见,您正在执行以下操作:
while(scan.hasNext()) {
jsonData += scan.next();
}
next()返回下一个由空格,换行等分隔的令牌。现在,由于必须从JSON数据中获取整行,因此可以执行以下操作:
while(scan.hasNextLine()) {
jsonData += scan.nextLine();
}
解决此问题的一种方法是使用像Jackson一样的库,该库知道如何解析json输入。 这是一个示例程序,该程序转到您提供的URL并创建一个DataTransferObject列表。
此代码取决于http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl/1.9.13
严格来讲,这不是您问题的答案,而是另一种方法。
package stackoverflow;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import java.io.IOException;
import java.net.URL;
import java.util.List;
public class JsonParser {
private static final String urlString = "https://api.guildwars2.com/v1/world_names.json";
public static void main(String[] args) throws IOException {
JsonParser parser = new JsonParser();
URL url = new URL(urlString);
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(url.openStream());
List<DataTransferObject> dtoList = mapper.readValue(root, new TypeReference<List<DataTransferObject>>(){});
for(DataTransferObject dto : dtoList) {
System.out.println("DTO: " + dto);
}
}
public static class DataTransferObject {
public int id;
public String name;
@Override
public String toString() {
return "ID: " + id + " NAME: " + name;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.