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. sql注入之简要注入

    #mysql简要注入流程 mysql注入简要流程如下图: 由于还没学习完先结合sqlilabs的第一关讲解信息收集的一部分和数据注入的information_schema的有据查询. #sqli-la ...

  2. Java基础 - 异常详解

    异常的层次结构 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示 ...

  3. Java中的序列化Serialable

    Java中的序列化Serialable https://blog.csdn.net/caomiao2006/article/details/51588838

  4. Java Arrays.asList(0,1,2,3,4,5,6,7,8,9).parallelStream().forEach 进行循环获取HttpServletRequest的为Null的解决方案

    Arrays.asList(0,1,2,3,4,5,6,7,8,9).parallelStream().forEach() parallelStream是并行执行流的每个元素,也就是多线程执行,这样就 ...

  5. 请说说你对Struts2的拦截器的理解?

    Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现. 拦截器栈(Interceptor Stac ...

  6. SpringBoot集成ArtemisMQ,设置动态消息类型

    SpringBoot项目集成ArtemisMQ,那么想动态的更换消息类型,怎么办呢? 通过设置org.springframework.jms.support.destination.JmsDestin ...

  7. 你在项目中哪些地方用到了 XML?

    XML 的主要作用有两个方面:数据交换和信息配置.在做数据交换时,XML 将数 据用标签组装成起来,然后压缩打包加密后通过网络传送给接收者,接收解密与 解压缩后再从 XML 文件中还原相关信息进行处理 ...

  8. 如何实现数组与List的相互转换?在 Queue 中 poll()和 remove()有什么区别?哪些集合类是线程安全的?

    如何实现数组与List的相互转换? List转数组:toArray(arraylist.size()方法 数组转List:Arrays的asList(a)方法 /** * 〈一句话功能简述〉; * 〈 ...

  9. selenium 模块使用

    selenium 概念:基于浏览器自动化的一个模块,可以模拟浏览器行为 环境的安装:下载selenium模块 selenium和爬虫之间的关联是什么? 便捷的获取页面中动态加载的数据 requests ...

  10. 『忘了再学』Shell基础 — 6、Bash基本功能(输入输出重定向)

    目录 1.Bash的标准输入输出 2.输出重定向 (1)标准输出重定向 (2)标准错误输出重定向 (3)正确输出和错误输出同时保存 3.输入重定向 1.Bash的标准输入输出 我们前边一直在说,在Li ...