2014-01-10 215 views
3

我是Gson解析的新手,並且做了很少的基本Gson解析。但是這次我的JSON非常複雜。我的JSON的樣子:用Gson解析json與嵌套數組

{"uname":"man101", 
"uid":"2", 
    "account":{ 
      "entry":[8,15.48], 
      "exit":[8,15.48], 
      "details": 
       [[0,0],[0,8.2],[1.15,8.2],[1.15,18.23],[7.33,18.23],[7.33,15.48],[12.15,2.28], 
       [12.35,2.28],[12.35,0],[10.65,0],[10.65,1.42],[8.1,1.42],[8.1,3.95], 
       [4.25,3.95],[4.25,0]], 

      "section": 
       [ 
        { 
         "account":[[0,0],[0,3.35], 
          [4.25,3.35],[4.25,0]], 
          "category":"office", 
          "description":"Mobile based company", 
          "sectionname":"xyz", 
          "id":1 
        }, 

        { 
         "account":[[0,3.95],[0,7.8], 
           [4.25,7.8],4.25,3.95]], 
         "category":"office", 
         "description":"Network based company", 
         "sectionname":"ABC", 
         "id":2 
        }, 
       ] 
      }, 
    "category":"Cowork", 
    "description":"Combined office space" 
} 

我試着解析這個在下列方式

public class AccountData 
{ 
    public String uname; 
    public String uid; 
    public String category; 
    public String description; 
    public Account account; 

    public class Account 
    { 
     public float[] entry; 
     public float[] exit; 
     public List<float[]> details; 
     public List<Section> section; 
    } 

    public class Section 
    { 
     public List<float[]> account; 
     public String category; 
     public String description; 
     public String sectionname; 
     public String id; 
    } 

} 

並嘗試通過產生這樣

Gson gson = new Gson(); 
beaconList = gson.fromJson(result, AccountData.class); 

它沒有任何錯誤運行,但是當我試圖訪問一些數據,它給出了空值。

回答

5

第一個所有,你的JSON是錯誤的,這裏是更正後的版本(注意例如你的代碼第9行中額外的逗號)。

{ 
    "uname": "man101", 
    "uid": "2", 
    "account": { 
    "entry": [ 
     8, 
     15.48 
    ], 
    "exit": [ 
     8, 
     15.48 
    ], 
    "details": [ 
     [ 
     0, 
     0 
     ], 
     [ 
     0, 
     8.2 
     ], 
     [ 
     1.15, 
     8.2 
     ], 
     [ 
     1.15, 
     18.23 
     ], 
     [ 
     7.33, 
     18.23 
     ], 
     [ 
     7.33, 
     15.48 
     ], 
     [ 
     12.15, 
     2.28 
     ], 
     [ 
     12.35, 
     2.28 
     ], 
     [ 
     12.35, 
     0 
     ], 
     [ 
     10.65, 
     0 
     ], 
     [ 
     10.65, 
     1.42 
     ], 
     [ 
     8.1, 
     1.42 
     ], 
     [ 
     8.1, 
     3.95 
     ], 
     [ 
     4.25, 
     3.95 
     ], 
     [ 
     4.25, 
     0 
     ] 
    ], 
    "section": [ 
     { 
     "account": [ 
      [ 
      0, 
      0 
      ], 
      [ 
      0, 
      3.35 
      ], 
      [ 
      4.25, 
      3.35 
      ], 
      [ 
      4.25, 
      0 
      ] 
     ], 
     "category": "office", 
     "description": "Mobile based company", 
     "sectionname": "xyz", 
     "id": 1 
     }, 
     { 
     "account": [ 
      [ 
      0, 
      3.95 
      ], 
      [ 
      0, 
      7.8 
      ], 
      [ 
      4.25, 
      7.8 
      ], 
      [ 
      4.25, 
      3.95 
      ] 
     ], 
     "category": "office", 
     "description": "Network based company", 
     "sectionname": "ABC", 
     "id": 2 
     } 
    ] 
    }, 
    "category": "Cowork", 
    "description": "Combined office space" 
} 

您可以http://json.parser.online.fr/http://www.bodurov.com/JsonFormatter/檢查JSON。

第二個,Gson不喜歡內部類,除非它們被聲明爲靜態的。

第三:避免在你的類混合陣列和仿製藥,仿製藥的使用更安全,所以我重新定義你的類,如下所示:

public class AccountData { 
    public String uname; 
    public String uid; 
    public String category; 
    public String description; 
    public Account account; 



    public static class Account { 
     public List<Double> entry; 
     public List<Double> exit; 
     public List<List<Double>> details; 
     public List<Section> section; 
    } 

    public static class Section { 
     public List<List<Double>> account; 
     public String category; 
     public String description; 
     public String sectionname; 
     public String id; 
    } 

} 

如果你不喜歡靜態內部類可以總是把SectionAccount分成不同的文件(當然沒有靜態關鍵字)。

編輯

正如布萊恩·羅奇在評論中指出,它不再是靜態與GSON很好地工作所需的內部類。所以第2點不再是真的,你可以從你的類聲明中移除靜態。

+0

就像FYI一樣,Gson對於非靜態內部類也沒有問題。除此之外,發現。 –

+0

@BrianRoach,請看看https://sites.google.com/site/gson/gson-user-guide#TOC-Nested-Classes-including-Inner-Classes-我指的是文檔的那一部分 – giampaolo

+0

是的,我知道他們的文檔在那裏說什麼。他們的文檔已經過時了)如果用當前版本的Gson測試它,你會發現它現在可以處理私有的非靜態內部類。 –