2014-01-10 166 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测试它,你会发现它现在可以处理私有的非静态内部类。 –