Gson解析复杂的Json数据

时间:2021-08-13 10:29:21
我的Json数据如下:
{"data":{"cars":[ {"coordinate":"120.1540000,30.3140000","driver":"driver","id":589,"license":"ABCDEFG9","speed":40,"status":0}, {"coordinate":"120.0827000,30.3136000","driver":"driver","id":591,"license":"ABCDEFG11","speed":40,"status":0}, {"coordinate":"120.3500000,30.3200000","driver":"driver","id":587,"license":"ABCDEFG7","speed":40,"status":0}],"department"[{"name":a},{"name":b},{"name":c}]}}

这个Json数据中有两个List,于是我定义了一个类:
public class  JasonData {
    public List<Cars> cars;
    public List<Departments> departments;
    public void SetCars(List<Cars> cars){
        this.cars=cars;
    }

    public List<Cars> GetCars(){
        return this.cars;
    }

    public void SetDepartment(List<Departments> departments){
        this.departments=departments;
    }

    public List<Departments> GetDepartment(){
        return this.departments;
    }
}


解析该数据的代码如下:
                Gson gson=new Gson();
                 java.lang.reflect.Type type = new TypeToken<FirstData>() {}.getType();
                JasonData Data=gson.fromJson(response, type);//response为返回的Jason数据
                
                 Data.cars.get(0);//想获得列表中第一个cars的数据,但是程序运行到这里是,直接跳过!!!
                 问题:该怎么访问Data中的list中的数据??

6 个解决方案

#1


分析下节点:
jsonObject ---> data ---> jsonObject --->cars ---> jsonArray( List<对象> ) 
cars ---> department---> jsonArray( List<对象> )

依次给出几点回答:
1.当然得需要一个Cars类和一个Departments,然后再是兄台上面的JasonData类
2. response数据有没有为空的情况
3.解析后 Data 中是否有数据 

4. 遍历取值:
 for(int i=0;i<Data.getCarList().size();i++){
            Log.i("GAO", Data.getCarList().get(i).getName());
        }

注:在bean中生成toString方法后,可直接 Log.i("GAO", Data.toString());

#2


很简单,显然你已经把Json解析成对象啦,那你就用GET方法把list集合拿出来,再去遍历拿出来的list用for或foreach都行

#3


实际要解析的Jason数据是这样的
{"data":{"cars":[{"coordinate":"120.1540000,30.3140000","driver":"driver","id":589,"license":"ABCDEFG9","speed":40,"status":0},{"coordinate":"120.0827000,30.3136000","driver":"driver","id":591,"license":"ABCDEFG11","speed":40,"status":0},{"coordinate":"120.3500000,30.3200000","driver":"driver","id":587,"license":"ABCDEFG7","speed":40,"status":0},{"coordinate":"120.1130000,30.4820000","driver":"driver","id":608,"license":"ABCDEFG28","speed":40,"status":0},{"coordinate":"120.1530000,30.4800000","driver":"driver","id":597,"license":"ABCDEFG17","speed":40,"status":0},{"coordinate":"120.3500000,30.3130000","driver":"driver","id":585,"license":"ABCDEFG5","speed":40,"status":0},{"coordinate":"120.3030000,30.1120000","driver":"driver","id":606,"license":"ABCDEFG26","speed":40,"status":0},{"coordinate":"120.2330000,30.3200000","driver":"driver","id":600,"license":"ABCDEFG20","speed":40,"status":0},{"coordinate":"120.4700000,30.3110000","driver":"driver","id":588,"license":"ABCDEFG8","speed":40,"status":0},{"coordinate":"120.5080000,30.3101000","driver":"driver","id":602,"license":"ABCDEFG22","speed":40,"status":0},{"coordinate":"120.2800000,30.4350000","driver":"driver","id":580,"license":"ABCDEFG0","speed":40,"status":0},{"coordinate":"120.0470000,30.0440000","driver":"driver","id":592,"license":"ABCDEFG12","speed":40,"status":0},{"coordinate":"120.3230000,30.1600000","driver":"driver","id":598,"license":"ABCDEFG18","speed":40,"status":0},{"coordinate":"120.2330000,30.1300000","driver":"driver","id":596,"license":"ABCDEFG16","speed":40,"status":0},{"coordinate":"120.2130000,30.4120000","driver":"driver","id":609,"license":"ABCDEFG29","speed":40,"status":0},{"coordinate":"120.1600000,30.2550000","driver":"driver","id":583,"license":"ABCDEFG3","speed":40,"status":0},{"coordinate":"120.1730000,30.2100000","driver":"driver","id":594,"license":"ABCDEFG14","speed":40,"status":0},{"coordinate":"120.3030000,30.2720000","driver":"driver","id":604,"license":"ABCDEFG24","speed":40,"status":0},{"coordinate":"120.4030000,30.1094000","driver":"driver","id":593,"license":"ABCDEFG13","speed":40,"status":0},{"coordinate":"120.1430000,30.2120000","driver":"driver","id":605,"license":"ABCDEFG25","speed":40,"status":0},{"coordinate":"120.2400000,30.3070000","driver":"driver","id":582,"license":"ABCDEFG2","speed":40,"status":0},{"coordinate":"120.0530000,30.2820000","driver":"driver","id":607,"license":"ABCDEFG27","speed":40,"status":0},{"coordinate":"120.1630000,30.3000000","driver":"driver","id":599,"license":"ABCDEFG19","speed":40,"status":0},{"coordinate":"120.5738000,30.2060000","driver":"driver","id":586,"license":"ABCDEFG6","speed":40,"status":0},{"coordinate":"120.1330000,30.0120000","driver":"driver","id":603,"license":"ABCDEFG23","speed":40,"status":0},{"coordinate":"120.1450000,30.3600000","driver":"driver","id":581,"license":"ABCDEFG1","speed":40,"status":0},{"coordinate":"120.1460000,30.2190000","driver":"driver","id":595,"license":"ABCDEFG15","speed":40,"status":0},{"coordinate":"120.2250000,30.3038000","driver":"driver","id":601,"license":"ABCDEFG21","speed":40,"status":0},{"coordinate":"120.0870000,30.3100000","driver":"driver","id":590,"license":"ABCDEFG10","speed":40,"status":0},{"coordinate":"120.3300000,30.2500000","driver":"driver","id":584,"license":"ABCDEFG4","speed":40,"status":0}],"departments":[{"cars":[],"coordinate":"120.5600000,30.2300000","name":"testdepartment"},{"cars":[],"coordinate":"120.3300000,30.5200000","name":"adddeptest"},{"cars":[{"id":608,"license":"ABCDEFG28"},{"id":609,"license":"ABCDEFG29"},{"id":606,"license":"ABCDEFG26"},{"id":607,"license":"ABCDEFG27"}],"coordinate":"120.1326000,30.1441000","name":"test4"},{"cars":[{"id":593,"license":"ABCDEFG13"},{"id":594,"license":"ABCDEFG14"},{"id":592,"license":"ABCDEFG12"},{"id":591,"license":"ABCDEFG11"}],"coordinate":"120.1337000,30.0765000","name":"test2"},{"cars":[{"id":600,"license":"ABCDEFG20"},{"id":590,"license":"ABCDEFG10"},{"id":598,"license":"ABCDEFG18"},{"id":596,"license":"ABCDEFG16"},{"id":595,"license":"ABCDEFG15"},{"id":585,"license":"ABCDEFG5"},{"id":605,"license":"ABCDEFG25"},{"id":597,"license":"ABCDEFG17"},{"id":599,"license":"ABCDEFG19"}],"coordinate":"120.0303000,30.8620000","name":"test3"},{"cars":[{"id":602,"license":"ABCDEFG22"},{"id":601,"license":"ABCDEFG21"},{"id":603,"license":"ABCDEFG23"},{"id":580,"license":"ABCDEFG0"},{"id":604,"license":"ABCDEFG24"}],"coordinate":"120.1922000,30.3954000","name":"test5"},{"cars":[{"id":581,"license":"ABCDEFG1"},{"id":583,"license":"ABCDEFG3"},{"id":582,"license":"ABCDEFG2"},{"id":584,"license":"ABCDEFG4"}],"coordinate":"120.1841000,30.4317000","name":"test0"},{"cars":[{"id":589,"license":"ABCDEFG9"},{"id":588,"license":"ABCDEFG8"},{"id":587,"license":"ABCDEFG7"},{"id":586,"license":"ABCDEFG6"}],"coordinate":"120.5871000,30.6613000","name":"test1"}]}}

我自己定义的JasonBean如下:

public class JasonBean {
    public List<Cars> cars;
    public List<Departments> departments;
    public void SetCars(List<Cars> cars){
        this.cars=cars;
    }
    public List<Cars> GetCars(){
        return this.cars;
    }
    public void SetDepartment(List<Departments> departments){
        this.departments=departments;
    }

    public List<Departments> GetDepartment(){
        return this.departments;
    } 
}

public class Cars {

    private String coordinate;
    private String driver;
    private String id;
    private String license;
    private String speed;
    private String status;
    public void SetSpeed(String speed){
            this.speed=speed;
    }
    public String GetSpeed(){
        return this.speed;
    }
    public void SetCarId(String carId){
        this.id=carId;
    }
    public String GetCarId(){
        return this.id;
    }

    public void SetCoordinate(String coordinate){
        this.coordinate=coordinate;
    }
    public String GetCoordinate(){
        return this.coordinate;
    }

    public void SetStatus(String status){
        this.status=status;
    }
    public String GetStatus(){
        return this.status;
    }

    public void SetDriver(String carId){
        this.driver=driver;
    }
    public String GetDriver(){
        return this.driver;
    }
    public void SetLicense(String license)
    {
        this.license=license;
    }
    public String GetLisence(){
        return this.license;
    }
}

public class Departments {
    List<CarList> cars;
    String coordinate;
    String name;
    public void setName(String name){
    this.name=name;
}
    public String getName(){return this.name;}

    public void setCoordinate(String string){
    this.coordinate=string;
}
    public String getCoordinate(){
        return this.coordinate;
    }
    public void setCars(List<CarList> cars){
        this.cars=cars;
    }
    public List<CarList> getCars(){
        return this.cars;
    }
}

public class CarList  {
    private String carId;
    private String license;

    public void setCarId(String carId){
        this.carId=carId;
    }
    public String getCarId(){
        return this.carId;
    }
    public void setLicense(String license)
    {
        this.license=license;
    }
    public String getLisence(String license){
        return this.license;
    }
}

当我高兴的把JasonBean写出来后,赶快用Gson解析,
 Gson gson=new Gson();
  java.lang.reflect.Type type=new TypeToken<FirstData>(){}.getType();
JasonBean     Data=gson.fromJson(response,type);
        经过调试发现Data为空!但是response返回来Jason数据!
问题:解析出现为空,肯定是我解析错误,是我JasonBean写错了吗?

#4


我的情况跟楼主类似,现在直接自己解析了没用Gson,如果楼主解决,请说一下原因,谢谢

#5


再定义一个实体Data
class Data {
        JasonBean  data;
}
Data data=gson.fromJson(response,Data.class);
另外CarList 实体里面的carId应为id,和json名字要对应

#6


亲测有用!!!谢谢亲!!!我觉得这和我用的
java.lang.reflect.Type type=new
                        TypeToken< Map<String,JasonData>>(){}.getType();
Map<String,JasonData>=gson.from(response,type);
解析出来的有异曲同工之妙,再次感谢!!!!

#1


分析下节点:
jsonObject ---> data ---> jsonObject --->cars ---> jsonArray( List<对象> ) 
cars ---> department---> jsonArray( List<对象> )

依次给出几点回答:
1.当然得需要一个Cars类和一个Departments,然后再是兄台上面的JasonData类
2. response数据有没有为空的情况
3.解析后 Data 中是否有数据 

4. 遍历取值:
 for(int i=0;i<Data.getCarList().size();i++){
            Log.i("GAO", Data.getCarList().get(i).getName());
        }

注:在bean中生成toString方法后,可直接 Log.i("GAO", Data.toString());

#2


很简单,显然你已经把Json解析成对象啦,那你就用GET方法把list集合拿出来,再去遍历拿出来的list用for或foreach都行

#3


实际要解析的Jason数据是这样的
{"data":{"cars":[{"coordinate":"120.1540000,30.3140000","driver":"driver","id":589,"license":"ABCDEFG9","speed":40,"status":0},{"coordinate":"120.0827000,30.3136000","driver":"driver","id":591,"license":"ABCDEFG11","speed":40,"status":0},{"coordinate":"120.3500000,30.3200000","driver":"driver","id":587,"license":"ABCDEFG7","speed":40,"status":0},{"coordinate":"120.1130000,30.4820000","driver":"driver","id":608,"license":"ABCDEFG28","speed":40,"status":0},{"coordinate":"120.1530000,30.4800000","driver":"driver","id":597,"license":"ABCDEFG17","speed":40,"status":0},{"coordinate":"120.3500000,30.3130000","driver":"driver","id":585,"license":"ABCDEFG5","speed":40,"status":0},{"coordinate":"120.3030000,30.1120000","driver":"driver","id":606,"license":"ABCDEFG26","speed":40,"status":0},{"coordinate":"120.2330000,30.3200000","driver":"driver","id":600,"license":"ABCDEFG20","speed":40,"status":0},{"coordinate":"120.4700000,30.3110000","driver":"driver","id":588,"license":"ABCDEFG8","speed":40,"status":0},{"coordinate":"120.5080000,30.3101000","driver":"driver","id":602,"license":"ABCDEFG22","speed":40,"status":0},{"coordinate":"120.2800000,30.4350000","driver":"driver","id":580,"license":"ABCDEFG0","speed":40,"status":0},{"coordinate":"120.0470000,30.0440000","driver":"driver","id":592,"license":"ABCDEFG12","speed":40,"status":0},{"coordinate":"120.3230000,30.1600000","driver":"driver","id":598,"license":"ABCDEFG18","speed":40,"status":0},{"coordinate":"120.2330000,30.1300000","driver":"driver","id":596,"license":"ABCDEFG16","speed":40,"status":0},{"coordinate":"120.2130000,30.4120000","driver":"driver","id":609,"license":"ABCDEFG29","speed":40,"status":0},{"coordinate":"120.1600000,30.2550000","driver":"driver","id":583,"license":"ABCDEFG3","speed":40,"status":0},{"coordinate":"120.1730000,30.2100000","driver":"driver","id":594,"license":"ABCDEFG14","speed":40,"status":0},{"coordinate":"120.3030000,30.2720000","driver":"driver","id":604,"license":"ABCDEFG24","speed":40,"status":0},{"coordinate":"120.4030000,30.1094000","driver":"driver","id":593,"license":"ABCDEFG13","speed":40,"status":0},{"coordinate":"120.1430000,30.2120000","driver":"driver","id":605,"license":"ABCDEFG25","speed":40,"status":0},{"coordinate":"120.2400000,30.3070000","driver":"driver","id":582,"license":"ABCDEFG2","speed":40,"status":0},{"coordinate":"120.0530000,30.2820000","driver":"driver","id":607,"license":"ABCDEFG27","speed":40,"status":0},{"coordinate":"120.1630000,30.3000000","driver":"driver","id":599,"license":"ABCDEFG19","speed":40,"status":0},{"coordinate":"120.5738000,30.2060000","driver":"driver","id":586,"license":"ABCDEFG6","speed":40,"status":0},{"coordinate":"120.1330000,30.0120000","driver":"driver","id":603,"license":"ABCDEFG23","speed":40,"status":0},{"coordinate":"120.1450000,30.3600000","driver":"driver","id":581,"license":"ABCDEFG1","speed":40,"status":0},{"coordinate":"120.1460000,30.2190000","driver":"driver","id":595,"license":"ABCDEFG15","speed":40,"status":0},{"coordinate":"120.2250000,30.3038000","driver":"driver","id":601,"license":"ABCDEFG21","speed":40,"status":0},{"coordinate":"120.0870000,30.3100000","driver":"driver","id":590,"license":"ABCDEFG10","speed":40,"status":0},{"coordinate":"120.3300000,30.2500000","driver":"driver","id":584,"license":"ABCDEFG4","speed":40,"status":0}],"departments":[{"cars":[],"coordinate":"120.5600000,30.2300000","name":"testdepartment"},{"cars":[],"coordinate":"120.3300000,30.5200000","name":"adddeptest"},{"cars":[{"id":608,"license":"ABCDEFG28"},{"id":609,"license":"ABCDEFG29"},{"id":606,"license":"ABCDEFG26"},{"id":607,"license":"ABCDEFG27"}],"coordinate":"120.1326000,30.1441000","name":"test4"},{"cars":[{"id":593,"license":"ABCDEFG13"},{"id":594,"license":"ABCDEFG14"},{"id":592,"license":"ABCDEFG12"},{"id":591,"license":"ABCDEFG11"}],"coordinate":"120.1337000,30.0765000","name":"test2"},{"cars":[{"id":600,"license":"ABCDEFG20"},{"id":590,"license":"ABCDEFG10"},{"id":598,"license":"ABCDEFG18"},{"id":596,"license":"ABCDEFG16"},{"id":595,"license":"ABCDEFG15"},{"id":585,"license":"ABCDEFG5"},{"id":605,"license":"ABCDEFG25"},{"id":597,"license":"ABCDEFG17"},{"id":599,"license":"ABCDEFG19"}],"coordinate":"120.0303000,30.8620000","name":"test3"},{"cars":[{"id":602,"license":"ABCDEFG22"},{"id":601,"license":"ABCDEFG21"},{"id":603,"license":"ABCDEFG23"},{"id":580,"license":"ABCDEFG0"},{"id":604,"license":"ABCDEFG24"}],"coordinate":"120.1922000,30.3954000","name":"test5"},{"cars":[{"id":581,"license":"ABCDEFG1"},{"id":583,"license":"ABCDEFG3"},{"id":582,"license":"ABCDEFG2"},{"id":584,"license":"ABCDEFG4"}],"coordinate":"120.1841000,30.4317000","name":"test0"},{"cars":[{"id":589,"license":"ABCDEFG9"},{"id":588,"license":"ABCDEFG8"},{"id":587,"license":"ABCDEFG7"},{"id":586,"license":"ABCDEFG6"}],"coordinate":"120.5871000,30.6613000","name":"test1"}]}}

我自己定义的JasonBean如下:

public class JasonBean {
    public List<Cars> cars;
    public List<Departments> departments;
    public void SetCars(List<Cars> cars){
        this.cars=cars;
    }
    public List<Cars> GetCars(){
        return this.cars;
    }
    public void SetDepartment(List<Departments> departments){
        this.departments=departments;
    }

    public List<Departments> GetDepartment(){
        return this.departments;
    } 
}

public class Cars {

    private String coordinate;
    private String driver;
    private String id;
    private String license;
    private String speed;
    private String status;
    public void SetSpeed(String speed){
            this.speed=speed;
    }
    public String GetSpeed(){
        return this.speed;
    }
    public void SetCarId(String carId){
        this.id=carId;
    }
    public String GetCarId(){
        return this.id;
    }

    public void SetCoordinate(String coordinate){
        this.coordinate=coordinate;
    }
    public String GetCoordinate(){
        return this.coordinate;
    }

    public void SetStatus(String status){
        this.status=status;
    }
    public String GetStatus(){
        return this.status;
    }

    public void SetDriver(String carId){
        this.driver=driver;
    }
    public String GetDriver(){
        return this.driver;
    }
    public void SetLicense(String license)
    {
        this.license=license;
    }
    public String GetLisence(){
        return this.license;
    }
}

public class Departments {
    List<CarList> cars;
    String coordinate;
    String name;
    public void setName(String name){
    this.name=name;
}
    public String getName(){return this.name;}

    public void setCoordinate(String string){
    this.coordinate=string;
}
    public String getCoordinate(){
        return this.coordinate;
    }
    public void setCars(List<CarList> cars){
        this.cars=cars;
    }
    public List<CarList> getCars(){
        return this.cars;
    }
}

public class CarList  {
    private String carId;
    private String license;

    public void setCarId(String carId){
        this.carId=carId;
    }
    public String getCarId(){
        return this.carId;
    }
    public void setLicense(String license)
    {
        this.license=license;
    }
    public String getLisence(String license){
        return this.license;
    }
}

当我高兴的把JasonBean写出来后,赶快用Gson解析,
 Gson gson=new Gson();
  java.lang.reflect.Type type=new TypeToken<FirstData>(){}.getType();
JasonBean     Data=gson.fromJson(response,type);
        经过调试发现Data为空!但是response返回来Jason数据!
问题:解析出现为空,肯定是我解析错误,是我JasonBean写错了吗?

#4


我的情况跟楼主类似,现在直接自己解析了没用Gson,如果楼主解决,请说一下原因,谢谢

#5


再定义一个实体Data
class Data {
        JasonBean  data;
}
Data data=gson.fromJson(response,Data.class);
另外CarList 实体里面的carId应为id,和json名字要对应

#6


亲测有用!!!谢谢亲!!!我觉得这和我用的
java.lang.reflect.Type type=new
                        TypeToken< Map<String,JasonData>>(){}.getType();
Map<String,JasonData>=gson.from(response,type);
解析出来的有异曲同工之妙,再次感谢!!!!