簡體   English   中英

如何從URL獲取json數據而不丟失Java中的空格?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM