简体   繁体   中英

Parsing json with nested arrays with Gson

I am new to Gson parsing and did few basic Gson parsing. But this time my JSON is much complex. My JSON looks like :

{"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"
}

And I tried to parse this in following way

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

}

And try to pass result like this

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

It's run without any error but when I tried to access some data it gives null values.

First of all, your JSON is wrong, here is the corrected version (note for example the extra comma in line 9 of your code).

{
  "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"
}

You can check your json with http://json.parser.online.fr/ or http://www.bodurov.com/JsonFormatter/ .

Second , Gson does not like inner classes so much, unless they are declared static.

and third : avoid mixing arrays and generics in your classes, generics are safer to use, so I redefined your class as follows:

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

}

If you don't like inner static classes you can always put Section and Account into separate files (without static keyword, of course).

EDIT

As Brian Roach pointed out in comments, it's not needed anymore for inner classes to be static to work well with Gson. So point 2 is no true anymore, you can remove static from your classes declaration.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM