从URL解析JSON

Per*_*ril 40 java url json

有没有最简单的方法来解析URL中的JSON?我用Gson我找不到任何有用的例子.

dac*_*cwe 66

  1. 首先,您需要下载URL(作为文本):

    private static String readUrl(String urlString) throws Exception {
        BufferedReader reader = null;
        try {
            URL url = new URL(urlString);
            reader = new BufferedReader(new InputStreamReader(url.openStream()));
            StringBuffer buffer = new StringBuffer();
            int read;
            char[] chars = new char[1024];
            while ((read = reader.read(chars)) != -1)
                buffer.append(chars, 0, read); 
    
            return buffer.toString();
        } finally {
            if (reader != null)
                reader.close();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后你需要解析它(这里你有一些选择).

    • GSON(完整示例):

      static class Item {
          String title;
          String link;
          String description;
      }
      
      static class Page {
          String title;
          String link;
          String description;
          String language;
          List<Item> items;
      }
      
      public static void main(String[] args) throws Exception {
      
          String json = readUrl("http://www.javascriptkit.com/"
                                + "dhtmltutors/javascriptkit.json");
      
          Gson gson = new Gson();        
          Page page = gson.fromJson(json, Page.class);
      
          System.out.println(page.title);
          for (Item item : page.items)
              System.out.println("    " + item.title);
      }
      
      Run Code Online (Sandbox Code Playgroud)

      输出:

      javascriptkit.com
          Document Text Resizer
          JavaScript Reference- Keyboard/ Mouse Buttons Events
          Dynamically loading an external JavaScript or CSS file
      
      Run Code Online (Sandbox Code Playgroud)
    • 尝试json.org的java API :

      try {
          JSONObject json = new JSONObject(readUrl("..."));
      
          String title = (String) json.get("title");
          ...
      
      } catch (JSONException e) {
          e.printStackTrace();
      }
      
      Run Code Online (Sandbox Code Playgroud)

  • 这将MANGLE JSON并产生解析错误.完全没必要从接收到的URL内容构建自己的字符串,GSON支持直接从BufferedReader读取.这个例子在每种情况下都不起作用 (2认同)

ccp*_*zza 11

GSON有一个构建器,它接受一个Reader对象:fromJson(Reader json,Class classOfT).

这意味着您可以从URL创建一个Reader,然后将其传递给Gson以使用该流并进行反序列化.

只有三行相关代码.

import java.io.InputStreamReader;
import java.net.URL;
import java.util.Map;

import com.google.gson.Gson;

public class GsonFetchNetworkJson {

    public static void main(String[] ignored) throws Exception {

        URL url = new URL("https://httpbin.org/get?color=red&shape=oval");
        InputStreamReader reader = new InputStreamReader(url.openStream());
        MyDto dto = new Gson().fromJson(reader, MyDto.class);

        // using the deserialized object
        System.out.println(dto.headers);
        System.out.println(dto.args);
        System.out.println(dto.origin);
        System.out.println(dto.url);
    }

    private class MyDto {
        Map<String, String> headers;
        Map<String, String> args;
        String origin;
        String url;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你碰巧得到403错误代码与端点,否则其工作正常(例如与curl或其他客户端),然后可能的原因可能是端点需要一个User-Agent标头,默认情况下Java URLConnection没有设置它.一个简单的解决方法是添加到文件的顶部,例如System.setProperty("http.agent", "Netscape 1.0");.


小智 10

您可以使用org.apache.commons.io.IOUtils进行下载,使用org.json.JSONTokener进行解析:

JSONObject jo = (JSONObject) new JSONTokener(IOUtils.toString(new URL("http://gdata.youtube.com/feeds/api/videos/SIFL9qfmu5U?alt=json"))).nextValue();
System.out.println(jo.getString("version"));
Run Code Online (Sandbox Code Playgroud)

  • 我想你必须在`new URL(...)`之后添加`.openStream()`.所以它必须如下所示:`JSONObject jo =(JSONObject)new JSONTokener(IOUtils.toString(new URL("http://gdata.youtube.com/feeds/api/videos/SIFL9qfmu5U?alt=json")).的OpenStream()))nextValue();` (2认同)