2014-02-16 79 views
-1

我無法理解此JSON字符串。使用GSON解釋和閱讀JSON

{ 
    "results":[ 
     { 
      "user":{ 
       "gender":"female", 
       "name":{ 
        "title":"miss", 
        "first":"taylor", 
        "last":"anderson" 
       }, 
       "location":{ 
        "street":"3645 dogwood ave", 
        "city":"roseburg", 
        "state":"new hampshire", 
        "zip":"20963" 
       }, 
       "email":"[email protected]", 
       "username":"heavyduck595", 
       "password":"liverpool", 
       "salt":"UK`o;9a_", 
       "md5":"6c8db0305b4591d8d9820d9f8edfd162", 
       "sha1":"906df4c09f3a87899666cb57bf974bd9b1950ea6", 
       "sha256":"3b12f5e51688578f845bef8ae1750d3e263c2010691010a80ce632a6b2323c03", 
       "registered":"1359027425", 
       "dob":"16243995", 
       "phone":"(934)-888-7068", 
       "cell":"(727)-467-8384", 
       "SSN":"697-20-6143", 
       "picture":"http://api.randomuser.me/0.3/portraits/women/30.jpg" 
      }, 
      "seed":"5eaf02877746c7e", 
      "version":"0.3" 
     } 
    ] 
} 

這是我第一次真正使用JSON,並且想要適當地解釋它。這是代碼我迄今:

static class Results{ 
      String results; 
     } 

     static class User{ 
      String gender; 
      String name; 
      String location; 
      List<Results> items; 
     } 


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

     public void larry() throws Exception{ 
      String json = readUrl("http://api.randomuser.me/"); 
      System.out.println(json); 
      Gson gson = new Gson();   
      User page = gson.fromJson(json, User.class); 

      System.out.println(page.name); 
      for (Results item : page.items) 
       System.out.println(" " + item.results); 
     } 
+0

還有一些打印縮進的東西,你可以使用「\ t」作爲製表符而不是像「」這樣的多個空格。 – Kuchi

+1

在你做其他事情之前,請轉到json.org並花費5分鐘時間來學習JSON語法 - 它非常簡單易懂。然後,在使用諸如GSON之類的東西來直接生成自定義Java對象之前,請使用其中一個「乾淨的」JSON解析器將JSON解析爲地圖和列表,並學習如何解決這些問題。那麼GSON等人的複雜性會更容易理解。 –

+0

(和谷歌的「JSON在線分析器」 - 有幾個在線工具將語法檢查和格式化JSON字符串,以便於閱讀。) –

回答

0

沒有什麼特別複雜約JSON,或將其映射到自己的Java類。你只需要瞭解基本結構。

您的JSON是一個只有一個字段的對象; results。這是什麼{}的意思是:

{ "results": ... } 

該字段包含一個數組。這是[]

{ "results": [ ... ] } 

該數組包含另一個對象(假設你在數組中有多個對象,但是你發佈的JSON只有一個)。該對象有三個字段,其中一個(「用戶」)持有另一個對象,另外兩個字符串。

要映射,爲自己的類,只需讓他們看起來像JSON:

class JsonResult { 
    List<Result> results; // JSON arrays map to Java Lists 
} 

class Result { 
    User user; 
    String seed; 
    String version; 
} 

class User { 
    String gender; 
    Name name; 
    // and so on ... 
} 

class Name { 
    String title; 
    String first; 
    String last; 
} 

等等。您可以構建類以匹配JSON中的對象(同樣,由{}表示),並相應地構造所有對象。

正如@HotLicks在他的評論中指出的那樣,您可以決定不映射到Java類並使用「乾淨的」解析器。事實上,Gson提供這個與JsonParser類。這將只是解析JSON在一棵樹上,從中可以提取您想要的信息:

JsonElement element = new JsonParser().parse(yourJsonString); 

從那裏你可以使用字段名訪問JSON結構:

JsonObject root = element.getAsJsonObject(); 
JsonArray array = root.getAsJsonArray("results"); 

通過訪問JSON結構你可以得到任何你想要的。