[英]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.