【问题标题】:Parsing json with nested arrays with Gson使用 Gson 解析带有嵌套数组的 json
【发布时间】:2014-01-10 17:13:35
【问题描述】:

我是 Gson 解析的新手,很少进行基本的 Gson 解析。但是这次我的 JSON 非常复杂。我的 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);

它运行没有任何错误,但是当我尝试访问一些数据时,它给出了空值。

【问题讨论】:

    标签: java android json gson


    【解决方案1】:

    首先,您的 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 放入单独的文件中(当然,不要使用 static 关键字)。

    编辑

    正如 Brian Roach 在 cmets 中指出的那样,内部类不再需要是静态的才能与 Gson 很好地配合使用。所以第 2 点不再正确,您可以从类声明中删除 static。

    【讨论】:

    • 仅供参考,Gson 对非静态内部类没有任何问题。除此之外,请注意。
    • @BrianRoach,请看sites.google.com/site/gson/…我指的是那部分文档
    • 是的,我知道他们的文档在那里说什么。而且他们的文档已经过时了;)如果您使用当前版本的 Gson 对其进行测试,您会发现它现在甚至可以处理私有的非静态内部类。
    • 有趣,要做一些测试并查看源代码...如果可以,请编辑一堆答案:\感谢您的澄清
    • 是的,我测试过,就像你说的那样。感谢您的澄清。将从这里开始编辑我以前的答案。
    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多