2014-09-19 76 views
0

所以我想解析一下我用GSON從api獲得的json。所有的例子都非常清楚,我完美地運作了它。但現在API給了我這樣的東西。在第二個大括號中爲項目製作課程不起作用,請參見下文。用GSON解析內層數組,從API JSON

所以我的問題是沒有人有一個想法如何使這項工作?

SOLUTION:

存放在這個地方,member.json

{"Peter":{"id":585897,"name":"PhPeter","profileIconId":691,"age":99,"email":"[email protected] "}} 

類,Member.java

package JsonPackage; 

public class Summoner { 

    int id; 
    String name; 
    int profileIconId; 
    int summonerLevel; 
    long revisionDate; 

    //getters setters 

    public String getName() { 
     return name; 
    } 

    public int getId() { 
     return id; 
    } 

    public int getProfileIconId() { 
     return profileIconId; 
    } 

    public int getSummonerLevel() { 
     return summonerLevel; 
    } 

    public long getRevisionDate() { 
     return revisionDate; 
    } 
} 

主類,MemberRead2Java.java:

package JsonPackage; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.StringReader; 
import java.util.Collection; 
import java.util.Iterator; 
import java.util.Map; 

import com.google.gson.Gson; 

public class ReadSummonerObject { 

    public static void main(String[] args) { 
     Gson gson = new Gson(); 

     try { 

      BufferedReader br = new BufferedReader(new FileReader("C:\\member.json")); //path to your file 


      Object obj = gson.fromJson(br, Object.class); 
      if (obj instanceof Map) { 
       Map map = (Map) obj; 
       Collection coll = map.values(); 
       Iterator iter = coll.iterator(); 
       while (iter.hasNext()) { 
        Object str = iter.next(); 

        StringReader sr = new StringReader(str.toString()); 
        Summoner summonerObj = gson.fromJson(sr, Summoner.class); 
        System.out.println("Id: " + summonerObj.getId()); 
        System.out.println("Name: " +summonerObj.getName()); 
        System.out.println("ProfileIconID: " + summonerObj.getProfileIconId()); 
        System.out.println("SummonerLevel: " + summonerObj.getSummonerLevel()); 
        System.out.println("RevisionDate: " + summonerObj.getRevisionDate()); 
       } 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

它爲什麼不起作用?錯誤信息說了什麼? – Dunes 2014-09-19 18:09:53

+0

您知道,將每個JSON字符串映射到POJO是沒有必要或不合理的。 – 2014-09-19 18:22:20

+0

請提供必要的詳細信息。你需要什麼幫助? – dosdebug 2014-09-19 18:22:28

回答

0

這裏是你如何能做到這一點:

基本上你會得到一個地圖爲您輸入(a key-value pair, in your case key is "Peter" and value is your Member object details),所以你必須遍歷映射值,(其中地圖的值是你的會員對象),只是轉換字符串到成員對象。

這裏我已經使用了StringReader(只是從字符串中讀取json)而不是BufferedReader(從.json文件讀取)。

public static void main(String[] args) { 

String json ="{\"Peter\":{\"id\":585897,\"name\":\"PhPeter\",\"profileIconId\":691,\"age\":99,\"email\":\"[email protected] \"}}"; 
Gson gson = new Gson(); 
StringReader reader = new StringReader(json); 
    //convert the json string back to object 
Object obj = gson.fromJson(reader, Object.class); 
if(obj instanceof Map){ 
    Map map =(Map)obj; 
    Collection coll = map.values(); 
    Iterator iter = coll.iterator(); 
    while(iter.hasNext()){ 
     Object str = iter.next(); 

     StringReader sr = new StringReader(str.toString()); 
     Member memberObj = gson.fromJson(sr, Member.class); 
    System.out.println("Id: " + memberObj.getId()); 
    System.out.println("Name: " + memberObj.getName()); 
    System.out.println("ProfileIconID: " + memberObj.getProfileIconId()); 
    System.out.println("Age: " + memberObj.getAge()); 
    System.out.println("Email: " + memberObj.getEmail()); 
    } 

} 

    } 

編輯: 這裏是另一個版本,從file.Just閱讀替換爲以下內容的主要方法,確保的FileReader路徑是正確的:

public static void main(String[] args) { 

     Gson gson = new Gson(); 
     try { 
      BufferedReader br = new BufferedReader(new FileReader("src/Member.json")); 

      Object obj = gson.fromJson(br, Object.class); 
      if (obj instanceof Map) { 
       @SuppressWarnings("unchecked") 
      Map<String,Object> map = (Map<String,Object>) obj; 
      Collection<Object> coll = map.values(); 
      Iterator<Object> iter = coll.iterator(); 
       while (iter.hasNext()) { 
        Object str = iter.next(); 

        StringReader sr = new StringReader(str.toString()); 
        Member memberObj = gson.fromJson(sr, Member.class); 
        System.out.println("Id: " + memberObj.getId()); 
        System.out.println("Name: " + memberObj.getName()); 
        System.out.println("ProfileIconID: " 
          + memberObj.getProfileIconId()); 
        System.out.println("Age: " + memberObj.getAge()); 
        System.out.println("Email: " + memberObj.getEmail()); 
       } 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

打印:

Id: 585897 
Name: PhPeter 
ProfileIconID: 691 
Age: 99 
Email: [email protected] 

對於您在評論中提出的問題:

public static void main(String[] args) { 
     Gson gson = new Gson(); 

     try { 

      BufferedReader br = new BufferedReader(new FileReader("src/Members.json")); //path to your file 


      Object obj = gson.fromJson(br, Object.class); 
      if (obj instanceof Map) { 
       Map map = (Map) obj; 
       Collection coll = map.values();  
       Iterator iter = coll.iterator(); 
       JsonParser parser = new JsonParser(); 
       while (iter.hasNext()) { 

        Object str = iter.next(); 
        JsonArray jsonArr = parser.parse(str.toString()).getAsJsonArray(); 
        for(int i=0;i<jsonArr.size();i++){ 

        Member memberObj = gson.fromJson(jsonArr.get(i).toString(), Member.class); 
        System.out.println("Id: " + memberObj.getId()); 
        System.out.println("Name: " +memberObj.getName()); 
        System.out.println("ProfileIconID: " + memberObj.getProfileIconId()); 
        System.out.println("Email: " + memberObj.getEmail()); 
        System.out.println("Age: " + memberObj.getAge()); 
        } 
       } 

      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+0

@PHPeter,你有沒有得到這個工作嗎?你試過我的解決方案嗎? – user3487063 2014-09-21 15:19:54

+0

是的,我得到它的工作完美。沒有反應的是,我很熟悉java,並希望在ti時做一件事我。它有效,但我不知道它在if語句的第一部分中的作用。順便說一句,我得到了關於類型映射,集合和迭代器的3個警告。地圖是一種原始類型。應參數化通用類型映射。 – PHPeter 2014-09-21 16:30:19

+0

@PHPeter,好吧,基本上,而不是映射到Member.java,您的json格式爲java.util.Map(基本上map是鍵值對的集合)。所以你的成員對象將是地圖中的一個值。所以你必須迭代地圖值並將其映射到Member.java,希望它很清楚。讓我知道你是否想要更多的解釋。在這種情況下,您可以忽略警告:) – user3487063 2014-09-21 21:10:42

0

既然你有一個內部數組,GSON期望這個內部數組作爲一個內部類,因爲它沒有找到一個,它可能會拋出錯誤。創建您的成員類如下:

class Member { 

    String member_name; // To hold the member name in the outer array 
    Details details; // You need an existing instance to parse the data into. I missed this. 

    // Inner class corresponding to inner array 
    public static class Details { 
     int id; 
     String name; 
     int profileIconId; 
     int age; 
     String email; 
     // Getters and setters for inner class 
    } 
    // Getters and setters for outer class 
    public Details getDetails() { 
     return this.details; 
    } 
    // Other getters and setters 
} 

構建您的成員對象從這個類,並引用它,你會像通常會與靜態嵌套類一樣。

Member memberObj = gson.fromJson(br, Member.class); 

要從內部類的訪問方法,只要做到以下幾點: //見我怎麼現在訪問現有的實例,而不是創建一個新的實例 //我想在飛行中被遺忘這個 Member.Details details = memberObj.getDetails(); String item = detail.getterMethodForItem();

+0

我明白如何修改成員類。但是,我如何從內部類調用getter方法? – PHPeter 2014-09-19 19:16:13

+0

@PHPeter - 你能看到關於如何訪問內部類方法的編輯 – ucsunil 2014-09-19 20:41:28

+0

我嘗試了你的建議,看到我編輯的原始文章,但它打印:「Id:0」應該是:「Id:585897」Where我錯了嗎 – PHPeter 2014-09-19 21:48:33