1.了解一下

通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。不过这个时候就出现了一个问题,这些数据到底要以什么样的格式在网络上传输呢?

随便传递一段文本肯定是不行的,因为另一方根本就不会知道这段文本的用途是什么。因此,一般都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语义,当另一方收到数据消息之后就可以按照相同的结构规格进行解析,从而取出他想要的那部分内容。

在网络上传输数据时最常用的格式有两种:XML JSON。相比 XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。因此,本节重点讲解JSON格式数据的解析。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它可以将JavaScript对象中表示的一组数据转换为字符串,然后就可以在网络或者程序之间轻松地传递这个字符串,并在需要的时候将它还原为各编程语言所支持的数据格式。··········JSON的建构主要有以下两种结构在;

(1)“名称/值"对的集合。不同的语言中,它被理解为对像(object).记录(record)、结构(struct)、字典(dictionary)、哈希表(hash table),有饥列表(keyed list)或者关联数组(association array)。

对象是一个无序的“名称/值"对的集合。一个对象以|“{”开始,以“}”结束。每个“名称”后跟一个“:”,多个“名称/值"之间使用“,”来分隔。例:

{" id":1,"name” : "zhangsan", "sex”:"M"","age":19}

(2)值的有序列表。在大部分语言中,它被理解为数组(array).

数组是值(value)的有序集会。一个数组以“[”开始,以“]”结束。值之间使用“,”分隔。例加,

[ { "id":1,"name" :"zhangsan", "sex":"M","age":19},

{"id":2,"nane": "lisi" , "sex" :"F" , "age":18},

{"id":3,"name" : "wangwu" , "sex": "M", "age":20} ]

2.如何解析

解析JSON格式的数据有很多种方法,可以使用官方提供的JSONObject,也可以使用Google的开源库GSON,还有一些第三方的开源库Jackson,FastJSON。

这里用FastJSON来解析百度AI返回的JSON格式数据。

首先在build.gradle下引入依赖:

implementation 'com.alibaba:fastjson:1.2.32'

现在我们看看什么是fastjson?
fastjson 是一个性能极好的用 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。

主要特点:

  • 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
  • 强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
  • 零依赖(没有依赖其它任何类库除了JDK)

  (1).生成Json

JavaBean,List<JavaBean>,List<String>,List<Map<String,Object>>

String jsonString = JSON.toJSONString(obj); 

(2).解析Json
1.JavaBean
Class class= JSON.parseObject(jsonString, Class.class); 

2.List<JavaBean>
List<Class> class="JSON".parseArray((jsonString, Class.class); 

3.List<String>
List<String> listString = JSON.parseArray(jsonString, String.class); 

4.List<Map<String,Object>>
List<Map<String, Object>> listMap = JSON.parseObject(jsonString, new TypeReference<List<Map<String,Object>>>(){}); 
这里我们选择JavaBean的方式解析。

先来看看百度AI返回的数据

注意我这里的map.put("face_field", "age,beauty,landmark");因为我不需要其他的,就只需要这三个。

将上面的数据排版一下:

现在可以清晰地看见这段数据的结构了,那我们怎么解析呢?

首先我们需要定义一个FaceDetectBean,用于将返回的JSON字符串转换为一个Java类对象。

public class FaceDetectBean {
public FaceDetectBean(){

}

public FaceDetectBean(int error_code, String error_msg, int log_id, int timestamp, int cached, ResultClass result) {
this.error_code = error_code;
this.error_msg = error_msg;
this.log_id = log_id;
this.timestamp = timestamp;
this.cached = cached;
this.result = result;
}

/**
"error_code":0,
"error_msg":"SUCCESS",
"log_id":2473751407,
"timestamp":1646563273,
"cached":0,
"result":{
*/
private int error_code;
private String error_msg;
private int log_id;
private int timestamp;
private int cached;
private ResultClass result;

public int getError_code() {
return error_code;
}

public void setError_code(int error_code) {
this.error_code = error_code;
}

public String getError_msg() {
return error_msg;
}

public void setError_msg(String error_msg) {
this.error_msg = error_msg;
}

public int getLog_id() {
return log_id;
}

public void setLog_id(int log_id) {
this.log_id = log_id;
}

public int getTimestamp() {
return timestamp;
}

public void setTimestamp(int timestamp) {
this.timestamp = timestamp;
}

public int getCached() {
return cached;
}

public void setCached(int cached) {
this.cached = cached;
}

public ResultClass getResult() {
return result;
}

public void setResult(ResultClass result) {
this.result = result;
}

}

对比一下:

是按照返回的内容写的FaceDetectBean的属性。

而最后的private ResultClass result; 是什么?

public class ResultClass {
/*
"face_num":1,
"face_list":[]
*/
private int face_num;
private List<face_list_bean> face_list;

public List<face_list_bean> getFace_list() {
return face_list;
}

public void setFace_list(List<face_list_bean> face_list) {
this.face_list = face_list;
}

public int getFace_num() {
return face_num;
}

public void setFace_num(int face_num) {
this.face_num = face_num;
}

}

对照一下:

那 List<face_list_bean>是什么呢?

public class face_list_bean{
/*
"face_token":"8ad51d2c97a022efa8ffb5f789fc9658",
"location":{
"left":99.57,
"top":112.13,
"width":258,
"height":230,
"rotation":-4 },
"face_probability":1,
"angle":{
"yaw":-4.94,
"pitch":22.63,
"roll":-6.86 },
"age":22,
"beauty":78.24,
"landmark":[
{"x":172.24,"y":148.64},
{"x":280.38,"y":140.28},
{"x":229.78,"y":222.21},
{"x":235.31,"y":264.27} ],
"landmark72":[{....}]
*/
private String face_token;
private locationbean location;
private int face_probability;
private anglebean angle;
private int age;
private double beauty;
private List<landmarkbean> landmark;
private List<landmark72bean> landmark72;

public String getFace_token() {
return face_token;
}

public void setFace_token(String face_token) {
this.face_token = face_token;
}

public locationbean getLocation() {
return location;
}

public void setLocation(locationbean location) {
this.location = location;
}

public int getFace_probability() {
return face_probability;
}

public void setFace_probability(int face_probability) {
this.face_probability = face_probability;
}

public anglebean getAngle() {
return angle;
}

public void setAngle(anglebean angle) {
this.angle = angle;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public double getBeauty() {
return beauty;
}

public void setBeauty(double beauty) {
this.beauty = beauty;
}

public List<landmarkbean> getLandmark() {
return landmark;
}

public void setLandmark(List<landmarkbean> landmark) {
this.landmark = landmark;
}

public List<landmark72bean> getLandmark72() {
return landmark72;
}

public void setLandmark72(List<landmark72bean> landmark72) {
this.landmark72 = landmark72;
}

}

接着,我们对照一下:

OK,locationbean,anglebean,List<landmarkbean>,List<landmark72bean>这些都是什么?

应该不用一一解释了吧,我把代码放上来。

public class locationbean {
/*
"location":{
"left":99.57,
"top":112.13,
"width":258,
"height":230,
"rotation":-4 },

*/
private double left;
private double top;
private double width;
private double height;
private double rotation;

public double getLeft() {
return left;
}

public void setLeft(double left) {
this.left = left;
}

public double getTop() {
return top;
}

public void setTop(double top) {
this.top = top;
}

public double getWidth() {
return width;
}

public void setWidth(double width) {
this.width = width;
}

public double getHeight() {
return height;
}

public void setHeight(double height) {
this.height = height;
}

public double getRotation() {
return rotation;
}

public void setRotation(double rotation) {
this.rotation = rotation;
}

}

public class anglebean {
/*
"angle":{
"yaw":-4.94,
"pitch":22.63,
"roll":-6.86 },
*/
private double yaw;
private double pitch;
private double roll;

public double getYaw() {
return yaw;
}

public void setYaw(double yaw) {
this.yaw = yaw;
}

public double getPitch() {
return pitch;
}

public void setPitch(double pitch) {
this.pitch = pitch;
}

public double getRoll() {
return roll;
}

public void setRoll(double roll) {
this.roll = roll;
}

}

public class landmarkbean{
/*
"landmark":[
{"x":172.24,"y":148.64},
{"x":280.38,"y":140.28},
{"x":229.78,"y":222.21},
{"x":235.31,"y":264.27} ],
*/
private double x;
private double y;
public double getX() {
return x;
}

public void setX(double x) {
this.x = x;
}

public double getY() {
return y;
}

public void setY(double y) {
this.y = y;
}

}
List<landmarkbean>和List<landmark72bean>内容一致。
至此,FaceDetectBean才算写完,这样我们的数据转为Java对象时,才能一一对应。

回到正题,我们开始对JSON格式的数据进行解析。
//解析JSON格式数据
JSON json = JSON.parseObject(result); //result为百度AI返回的JSON格式数据
FaceDetectBean faceDetectBean = JSON.toJavaObject(json,FaceDetectBean.class); //将result转为FaceDetectBean的对象,这样我们就可以对数据进行操作了。
ResultClass resultClass =faceDetectBean.getResult(); //通过getResult()获取到ResultClass的对象
List<face_list_bean> face_list = resultClass.getFace_list(); //通过getFace_list()获取到List<face_list_bean>的对象,我们需要的东西都放在这里面。
for(int i=0;i<face_list.size();i++){ //从图片上的第一张人脸开始
face_list_bean myface = face_list.get(i); //得到该人脸的face_list_bean对象
List<landmark72bean> landmark72beanList = myface.getLandmark72();
landmark72bean landmark72_left = landmark72beanList.get(17);
landmark72bean landmark72_right = landmark72beanList.get(30);
System.out.println("x="+landmark72_left.getX()+", y="+landmark72_left.getY());
System.out.println("x="+landmark72_right.getX()+", y="+landmark72_right.getY());
left_x = landmark72_left.getX();
left_y = landmark72_left.getY();
right_x = landmark72_right.getX();
right_y = landmark72_right.getY();
double dx = (left_x - right_x);
double dy = (left_y - right_y);
distance = Math.sqrt(dx*dx + dy*dy );
System.out.println("distance===>"+distance);
}
因为我需要的是landmark里人脸关键点的坐标,所以一直获取到 landmark的对象才可以。
如果只需要age,beauty则得到face_list_bean的对象就可以了。通过 对象.getAge()方法就能得到年龄。
总之,需要什么信息,就看看该信息是哪个类的属性。通过创建该类的对象,对象的get,set方法对数据进行操作。
----------------------
源码:https://github.com/Xiang-MY/BDALdemo

百度AI人脸检测——解析JSON 数据格式的更多相关文章

  1. 基于百度AI人脸识别技术的Demo

    编写demo之前首先浏览官方API:http://ai.baidu.com/docs#/Face-API/top 下面是源码: package com.examsafety.test; import ...

  2. C语言cJSON库的使用,解析json数据格式

    C语言cJSON库的使用,解析json数据格式 摘自:https://www.cnblogs.com/piaoyang/p/9274925.html 对于c语言来说是没有字典这样的结构的,所以对于解析 ...

  3. 百度AI—人脸在线比对

    首先访问百度AI网站:https://cloud.baidu.com/,按照下图的指示点开到应用管理的页面. 穿件完成之后到管理中可以查看到对应的 添加工具类: using System; using ...

  4. 百度AI人脸识别的学习总结

    本文主要分以下几个模块进行总结分析 项目要求:运用百度AI(人脸识别)通过本地与外网之间的信息交互(MQService),从而通过刷脸实现登陆.签字.会议签到等: 1.准备工作: 内网:单击事件按钮— ...

  5. android 解析json数据格式(转)

    json数据格式解析我自己分为两种: 一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下: {"userbean":{"Uid" ...

  6. android 解析json数据格式

    json数据格式解析我自己分为两种: 一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下: {"userbean":{"Uid" ...

  7. <转>android 解析json数据格式

    json数据格式解析我自己分为两种:一种是普通的,一种是带有数组形式的: 普通形式的:服务器端返回的json数据格式如下:{"userbean":{"Uid": ...

  8. android之解析json数据格式详解

    1.JSON解析     (1).解析Object之一: view sourceprint? 1 {"url":"http://www.cnblogs.com/qianx ...

  9. 基于C# 调用百度AI 人脸识别

    一.设置 登录百度云控制台,添加应用-添加人脸识别,查找,对比等. 记住API Key和Secret Key 二.创建Demo程序 1.使用Nuget安装 Baidu.AI 和 Newtonsoft. ...

随机推荐

  1. luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)

    luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp) Luogu 题外话: 我可能是傻逼, 但不管我是不是傻逼, 我永远单挑出题人. 题解时间 看数据范围可以确定状压dp. ...

  2. 垃圾收集器G1和CMS ,以及老年代和新生代的比例设置

    首先 1.G1是包括年轻代和年老代的GC 2.CMS是年老代GC 3.二者在某些时候都需要FullGC(serial old GC)的辅助 ###CMS收集器:CMS(ConCurrent Mark ...

  3. linux安装maven环境

    linux安装maven环境 一. 下载压缩包: 官网地址: http://maven.apache.org/download.cgi 或者百度网盘链接:https://pan.baidu.com/s ...

  4. 文件下载文件名包含中文时,乱码的处理方法(url编解码)

    utf-8/gbk编码 "中"这个汉子的utf-8编码为:E4B8AD gbk编码为:D6D0 urlencode 经过urlencode编码后, %E4%B8%AD %D6%D0 ...

  5. spring 提供了哪些配置方式?

    基于 xml 配置 bean 所需的依赖项和服务在 XML 格式的配置文件中指定.这些配置文件通常 包含许多 bean 定义和特定于应用程序的配置选项.它们通常以 bean 标签开 头. 例如: &l ...

  6. 企业流程再造(BPR)--系统重构

    企业流程再造(BPR) 企业流程:指生产或服务过程中一连串活动的工作流程 企业流程再造:对企业流程所进行的根本性的在思考和彻底的再设计,以使企业的速度,质量,服务和成本等关键业绩指标获得根本性的改善

  7. ROS的安装-> rosdep init /update报错2022.02.24实测有效

    ROS的安装-> rosdep init /update报错2022.02.24实测有效   一. 解决rosdep_init问题 正常执行sudo rosdep init会报错,如下: ERR ...

  8. MTK平台电路设计01

    一.资料 获取途径MTK官网.一牛网 二.

  9. 6_稳定性_李雅普诺夫_Lyapunov

    李雅普诺夫方法参考  

  10. carsim的一些注意事项

    1.carsim导入simulink中运行的目录下最好有simfile.sim文件,可以再carsim_2016.1_date中找到(文件夹内最下端) 2.carsim导入simulink中如果显示下 ...