繁体   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