【问题标题】:MalformedURLException with GSON and JSON带有 GSON 和 JSON 的 MalformedURLException
【发布时间】:2016-12-18 18:40:13
【问题描述】:

我遇到以下错误:

Exception in thread "main" java.lang.RuntimeException: java.net.MalformedURLException: no protocol: url at test.getJsonFromUrl(test.java:67) at test.main(test.java:75) Caused by: java.net.MalformedURLException: no protocol: url ...

这是我的完整代码:

import java.io.Reader;
import java.net.URL;
import com.google.gson.*;
import java.io.IOException;
import java.io.InputStreamReader;

public class test {

public static String getJsonFromUrl(String url){
Gson gson = new GsonBuilder().create();
try{
    Reader reader = new InputStreamReader(new URL("url").openStream());
    gson.fromJson(reader, String.class);

}catch(IOException e){
        throw new RuntimeException(e);

}

    return gson.toString();
}

public static void main(String[] args) {
    String json = getJsonFromUrl("https://api.kraken.com/0/public/Assets?asset=XBT");
    System.out.println(json);

    }

}

不知道问题出在哪里,因为如果我在浏览器中复制 url,它会显示 JSON 内容... 我猜它是一个网址?我该如何解决?

【问题讨论】:

    标签: json url gson malformedurlexception


    【解决方案1】:

    您使用的是字符串文字,而不是变量...

    new URL("url").openStream()
    

    应该是

    new URL(url).openStream()
    

    注意引号,它表示应该将某些内容解释为字符串

    【讨论】:

      【解决方案2】:

      下面这行不正确

      gson.fromJson(reader, String.class);
      

      第一个参数是 stringify json 而不是 reader 对象。

      第二个参数是你的模型类,而不是字符串类。

      【讨论】:

      • 谢谢,但我不明白第二个参数(模型类)。我不想使用它们 :) 我只想说:“将阅读器内容放在我的 gson 对象中”你有什么想法吗?
      • 当你将json转换成一个对象时,就是我所说的模型,你可以使用工具轻松生成它们,例如这个jsonschema2pojo.org
      • @AndiAbseits 如果您不想要模型,请使用JSONObject
      【解决方案3】:

      好的,我都更改了,我得到了以下输出:

      {serializeNulls:falsefactories:[Factory[typeHierarchy=com.google.gson.JsonElement,adapter=com.google.gson.internal.bind.TypeAdapters$29@52a86356], com.google.gson.internal.bind.ObjectTypeAdapter$1@5ce81285, com.google.gson.internal.Excluder@78c03f1f, Factory[type=java.lang.String,adapter=com.google.gson.internal.bind.TypeAdapters$16@5ec0a365], Factory[type=java.lang.Integer+int,adapter=com.google.gson.internal.bind.TypeAdapters$7@4fe3c938], Factory[type=java.lang.Boolean+boolean,adapter=com.google.gson.internal.bind.TypeAdapters$3@5383967b], Factory[type=java.lang.Byte+byte,adapter=com.google.gson.internal.bind.TypeAdapters$5@2ac273d3], Factory[type=java.lang.Short+short,adapter=com.google.gson.internal.bind.TypeAdapters$6@71423665], Factory[type=java.lang.Long+long,adapter=com.google.gson.internal.bind.TypeAdapters$11@20398b7c], Factory[type=java.lang.Double+double,adapter=com.google.gson.Gson$2@6fc6f14e], Factory[type=java.lang.Float+float,adapte
      

      等等(它不是完整的输出)。这是我的代码:

      public static String getJsonFromUrl(String url){
          Gson gson = new GsonBuilder().create();
          try{
              Reader reader = new InputStreamReader(new URL(url).openStream());
              gson.fromJson(reader, JsonObject.class);
      
          }catch(IOException e){
              throw new RuntimeException(e);
      
          }
      
          return gson.toString();
      }
      
      public static void main(String[] args) {
          String json = getJsonFromUrl("https://api.kraken.com/0/public/Assets?asset=XBT");
          System.out.println(json);
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 1970-01-01
        • 2014-02-12
        • 2018-12-25
        • 2014-04-26
        • 1970-01-01
        • 2011-10-24
        • 2018-04-29
        • 1970-01-01
        相关资源
        最近更新 更多