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. path()的name属性,有什么用?

    官网(参考:命名 URL 模式) 命名 URL 模式: 为了完成反向解析 URL ,你需要像上面那样使用 命名 URL 模式 .用于命名 URL 的字符串可以包含任意字符,并不仅限于 Python 里 ...

  2. 12.8 typora快捷键

    Markdown学习 标题: n个#号 字体 粗体:要加粗的字两边加两个** 如 ** 粗体** 斜体:两边一个*号 斜体加粗: 两边三个*号 删除线:两边两个波浪号 引用 github 左边一个大于 ...

  3. Linux开发板(树莓派)和服务器进行双向通信(socket)

    前言 ​ 物联网是目前嵌入开发必备的属性之一,我们常常需要把自己开发板和云端进行交互,本篇博文就记录一下. ​ 使用Socket来实现Linux开发板和服务器进行双向通信,Python中是默认集成了s ...

  4. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  5. Mybatis 是如何进行分页的?分页插件的原理是什么?

    Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内 存分页,而非物理分页.可以在 sql 内直接书写带有物理分页的参数来完成物理分 页功能,也可以使用 ...

  6. 说一下 jvm 有哪些垃圾回收器?

    新生代收集器: SerialParNewParallel Scavenge 老年代收集器: Serial OldCMSParallel Old 堆内存垃圾收集器: G1 参考链接:JVM常见的垃圾回收 ...

  7. ACL 权限控制机制?

    UGO(User/Group/Others) 目前在 Linux/Unix 文件系统中使用,也是使用最广泛的权限控制方式.是一种粗 粒度的文件系统权限控制模式. ACL(Access Control ...

  8. TCP 重传、滑动窗⼝、流量控制、拥塞控制

    重传机制 TCP 会在以下两种情况发⽣超时重传: 数据包丢失 确认应答丢失 重传超时 重传超时是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果 ...

  9. js技术之根据name获取input的值

    一.前端的代码 <p>Name: <input type='text', name = 'name'/></p> <p>Age: <input t ...

  10. 无人驾驶—高精地图和V2X

    高精地图将厘米级的静态信息传传递给无人车V2X将路况上的动态信息传递给无人车 高精地图的作用 高精地图与传统地图的对比 高精地图与定位的关系 上图左侧是感知到的区域,右侧是高精地图,之后进行拼接获得车 ...