Android利用Gson库解析复杂结构的JSON数据

最近在应用Face++进行人脸识别开发时,经常需要解析Face++返回的结构复杂的JSON数据,于是便决定应用Google开发的Gson库来减轻工作量。

首先给大家看一个比较复杂的JSON数据:

{"face":[{"attribute":{"age":{"range":5,"value":6},"gender":{"confidence":89.7809,"value":"Male"},"race":{"confidence":94.9838,"value":"White"},"smiling":{"value":83.7032}},"face_id":"ae797d3bf784abc8fa27428ec42b19f7","position":{"center":{"x":33.407572,"y":33.333333},"eye_left":{"x":26.288641,"y":35.323167},"eye_right":{"x":34.399777,"y":36.374833},"height":-3.666667,"mouth_left":{"x":27.464365,"y":32.378667},"mouth_right":{"x":33.869265,"y":30.975667},"nose":{"x":27.94343,"y":33.4925},"width":17.371938},"tag":""}],"img_height":600,"img_id":"dc69e22f73aa19d544cd237a4f5ceb15","img_width":449,"session_id":"cd4fa25b83a349a1a52f78789bcfae61","url":null,"response_code":200}

为了让大家更清晰的看清这个层次结构,我把这个JSON数据以树状结构呈现给大家,如下:

{
    "face": [
        {
            "attribute": {
                "age": {
                    "range": 5, 
                    "value": 23
                }, 
                "gender": {
                    "confidence": 99.9999, 
                    "value": "Female"
                }, 
                "glass": {
                    "confidence": 99.945, 
                    "value": "None"
                }, 
                "pose": {
                    "pitch_angle": {
                        "value": 17 }, 
                    "roll_angle": {
                        "value": 0.735735 }, 
                    "yaw_angle": {
                        "value": -2 }
                }, 
                "race": {
                    "confidence": 99.6121, 
                    "value": "Asian"
                }, 
                "smiling": {
                    "value": 4.86501
                }
            }, 
            "face_id": "17233b4b1b51ac91e391e5afe130eb78", 
            "position": {
                "center": {
                    "x": 49.4, 
                    "y": 37.6
                }, 
                "eye_left": {
                    "x": 43.3692, 
                    "y": 30.8192
                }, 
                "eye_right": {
                    "x": 56.5606, 
                    "y": 30.9886
                }, 
                "height": 26.8, 
                "mouth_left": {
                    "x": 46.1326, 
                    "y": 44.9468
                }, 
                "mouth_right": {
                    "x": 54.2592, 
                    "y": 44.6282
                }, 
                "nose": {
                    "x": 49.9404, 
                    "y": 38.8484
                }, 
                "width": 26.8
            }, 
            "tag": ""
        }
    ], 
    "img_height": 500, 
    "img_id": "22fd9efc64c87e00224c33dd8718eec7", 
    "img_width": 500, 
    "session_id": "38047ad0f0b34c7e8c6efb6ba39ed355", 
    "url": "http://www.faceplusplus.com.cn/wp-content/themes/faceplusplus/assets/img/demo/1.jpg?v=4"
}

接下来就给大家展示如何将JSON数据转换成我们需要的Android对象。

首先我们要定义一个JSON数据对应的POJO,即JavaBeans.java。那么有些人可能不太熟悉JavaBeans的构建,不用担心,只要按以下两个原则,即可轻松构建:

1、[ ]前面的元素定义成List< B > b形式,如,public List< Face > face;而{ }前面的元素定义为 public C c形式即可,如,public String img_id 或 public Attribute attribute。
2、类里面的属性名必须跟JSON字段里面的Key是一模一样的;

所有根据上述规则,我们建立出的JavaBeans.java如下:

public class JavaBeans{
    private int img_height;
    private int img_width;
    private String img_id;
    private String session_id;
    private String url;
    private List<Face> face;  //face属于包含多个元素的JSONArray,所以定义为List,存储这多个元素。而且Face中包含多个属性,故声明为一个内部类,见下方

    public int getImg_height() {
        return img_height;
    }

    public int getImg_width() {
        return img_width;
    }

    public String getImg_id() {
        return img_id;
    }

    public String getSession_id() {
        return session_id;
    }

    public String getUrl() {
        return url;
    }

    public List<Face> getFace() {
        return face;
    }

    public class Face {
        private Attribute attribute;   //Attribute中包含多个属性,故声明为一个内部类,见下方
        private String face_id;
        private Position postion;
        private String tag;

        public String getFace_id() {
            return face_id;
        }

        public Attribute getAttribute() {
            return attribute;
        }

        public Position getPostion() {
            return postion;
        }

        public String getTag() {
            return tag;
        }

        public class Attribute {
            private Age age;
            private Gender gender;
            private Glass glass;
            private Pose pose;
            private Race race;
            private Smiling smiling;

            public Age getAge() {
                return age;
            }

            public Gender getGender() {
                return gender;
            }

            public Glass getGlass() {
                return glass;
            }

            public Pose getPose() {
                return pose;
            }

            public Race getRace() {
                return race;
            }

            public Smiling getSmiling() {
                return smiling;
            }

            public class Age {
                private int range;
                private int value;

                public int getRange() {
                    return range;
                }

                public int getValue() {
                    return value;
                }
            }

            public class Gender {
                private double confidence;
                private String value;

                public double getConfidence() {
                    return confidence;
                }

                public String getValue() {
                    return value;
                }
            }

            public class Glass {
                //同Age理,省略
            }

            public class Pose {
                //同Age理,省略
            }

            public class Race {
                //同Age理,省略
            }

            public class Smiling {
                //同Age理,省略
            }
        }

        public class Position {
            //同Attribute理,省略
        }
    }
}

最后,就是利用Gson将JSON数据转换为JavaBeans对象了:


JSONObject result = ....;   //从网站获取的JSON数据

Gson gson = new Gson();

JavaBeans data = gson.fromJson(result.toString(), JavaBeans.class);

//获取第一个脸谱的age值
int age=data.getFace().get(0).getAttribute().getAge().getValue();
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值