2011-09-19 43 views
37

Có cách nào đơn giản nhất để phân tích JSON từ URL không? Tôi đã sử dụng Gson Tôi không thể tìm thấy bất kỳ ví dụ hữu ích nào.Phân tích JSON từ URL

+1

Bạn có ví dụ không? Ví dụ: –

+0

ví dụ: http://gdata.youtube.com/feeds/api/videos/SIFL9qfmu5U?alt=json hoặc từ biểu đồ facebook – Peril

Trả lời

63
  1. Trước tiên, bạn cần phải tải về URL (dưới dạng văn bản):

    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(); 
        } 
    } 
    
  2. Sau đó, bạn cần phải phân tích nó (và ở đây bạn có một số tùy chọn).

    • GSON (full ví dụ):

      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); 
      } 
      

      Đầu ra:

      javascriptkit.com 
          Document Text Resizer 
          JavaScript Reference- Keyboard/ Mouse Buttons Events 
          Dynamically loading an external JavaScript or CSS file 
      
    • Hãy thử API java từ json.org:

      try { 
          JSONObject json = new JSONObject(readUrl("...")); 
      
          String title = (String) json.get("title"); 
          ... 
      
      } catch (JSONException e) { 
          e.printStackTrace(); 
      } 
      
+1

thẻ 'java' này cho biết rằng anh ấy không muốn sử dụng javascript. –

+0

http://json.org/java – Anders

+0

URL này sẽ phân tích cú pháp url? – Peril

9

Bạn có thể sử dụng org.apache.commons.io.IOUtils để tải về và org.json.JSONTokener cho phân tích cú pháp:

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")); 
+2

cuối cùng Tôi nghĩ bạn phải thêm '.openStream()' sau 'URL mới (...) '. Vì vậy, nó phải trông như thế này: 'JSONObject jo = (JSONObject) JSONTokener mới (IOUtils.toString (URL mới (" http://gdata.youtube.com/feeds/api/videos/SIFL9qfmu5U?alt=json ") .openStream())). nextValue(); ' – Selphiron

+0

@ Selphiron, Làm việc một cách hoàn hảo. Cảm ơn rất nhiều. – mahi

1

Dưới đây là một phương pháp dễ dàng.

Đầu tiên phân tích cú pháp JSON từ url -

public String readJSONFeed(String URL) { 
    StringBuilder stringBuilder = new StringBuilder(); 
    HttpClient httpClient = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(URL); 

    try { 

     HttpResponse response = httpClient.execute(httpGet); 
     StatusLine statusLine = response.getStatusLine(); 
     int statusCode = statusLine.getStatusCode(); 

     if (statusCode == 200) { 

      HttpEntity entity = response.getEntity(); 
      InputStream inputStream = entity.getContent(); 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(inputStream)); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       stringBuilder.append(line); 
      } 

      inputStream.close(); 

     } else { 
      Log.d("JSON", "Failed to download file"); 
     } 
    } catch (Exception e) { 
     Log.d("readJSONFeed", e.getLocalizedMessage()); 
    } 
    return stringBuilder.toString(); 
} 

Sau đó đặt một nhiệm vụ và sau đó đọc giá trị mong muốn từ JSON -

private class ReadPlacesFeedTask extends AsyncTask<String, Void, String> { 
    protected String doInBackground(String... urls) { 

     return readJSONFeed(urls[0]); 
    } 

    protected void onPostExecute(String result) { 

     JSONObject json; 
     try { 
      json = new JSONObject(result); 

     ////CREATE A JSON OBJECT//// 

     JSONObject data = json.getJSONObject("JSON OBJECT NAME"); 

     ////GET A STRING//// 

     String title = data.getString(""); 

     //Similarly you can get other types of data 
     //Replace String to the desired data type like int or boolean etc. 

     } catch (JSONException e1) { 
      e1.printStackTrace(); 

     } 

     //GETTINGS DATA FROM JSON ARRAY// 

     try { 

      JSONObject jsonObject = new JSONObject(result); 
      JSONArray postalCodesItems = new JSONArray(
        jsonObject.getString("postalCodes")); 

       JSONObject postalCodesItem = postalCodesItems 
         .getJSONObject(1); 

     } catch (Exception e) { 
      Log.d("ReadPlacesFeedTask", e.getLocalizedMessage()); 
     } 
    } 
} 

Sau đó bạn có thể đặt một nhiệm vụ như thế này -

new ReadPlacesFeedTask() 
    .execute("JSON URL"); 
-6

Một giải pháp thay thế đơn giản:

  • Dán URL vào một json để chuyển đổi csv

  • Mở tệp CSV trong hoặc Excel hoặc Open Office

  • Sử dụng các công cụ bảng tính để phân tích các dữ liệu

+2

Đây là câu trả lời có chất lượng rất thấp. Tôi không nghĩ rằng việc sử dụng Excel là một giải pháp phức tạp cho vấn đề này. –

+0

có thể thúc đẩy chuyển đổi từ json sang csv không? – zundi

0
import org.apache.commons.httpclient.util.URIUtil; 
import org.apache.commons.io.FileUtils; 
import groovy.json.JsonSlurper; 
import java.io.File; 

    tmpDir = "/defineYourTmpDir" 
    URL url = new URL("http://yourOwnURL.com/file.json"); 
    String path = tmpDir + "/tmpRemoteJson" + ".json"; 
    remoteJsonFile = new File(path); 
    remoteJsonFile.deleteOnExit(); 
    FileUtils.copyURLToFile(url, remoteJsonFile); 
    String fileTMPPath = remoteJsonFile.getPath(); 

    def inputTMPFile = new File(fileTMPPath); 
    remoteParsedJson = new JsonSlurper().parseText(inputTMPFile.text); 
1
public static TargetClassJson downloadPaletteJson(String url) throws IOException { 
     if (StringUtils.isBlank(url)) { 
      return null; 
     } 
     String genreJson = IOUtils.toString(new URL(url).openStream()); 
     return new Gson().fromJson(genreJson, TargetClassJson.class); 
    } 
8

GSON có công cụ xây dựng tại một đối tượng Reader: fromJson(Reader json, Class classOfT).

Điều này có nghĩa là bạn có thể tạo Trình đọc từ một URL và sau đó chuyển nó tới Gson để tiêu thụ luồng và thực hiện deserialisation.

Chỉ ba dòng mã tương ứng.

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; 
    } 
} 
+0

nếu json - args có các phần tử mảng thì sao? –

+0

@Sundar: cho mảng bạn sử dụng TypeToken: https://stackoverflow.com/a/10292824/191246 – ccpizza

0

tôi sử dụng java 1.8 với com.fasterxml.jackson.databind.ObjectMapper

ObjectMapper mapper = new ObjectMapper(); 
Integer  value = mapper.readValue(new URL("your url here"), Integer.class); 

Integer.class có thể cũng là một loại phức tạp. Chỉ cần ví dụ được sử dụng.