好多Java开发者们。感觉解析JSON读取识别的结果内容表示不太方便。鄙人就打个样。O(∩_∩)O 大神就不要鄙视了哦
原图文件(被我裁剪了一下)
- Java通过SDK方式请求通用文字识别接口并解析JSON字符串
import java.util.HashMap;
import java.util.List;
import org.json.JSONObject;
import pay.CMBC.BaiDuOCRBean.Words_result;
import com.alibaba.fastjson.JSON;
import com.baidu.aip.ocr.AipOcr;
/**
* @author 小帅丶
* @类名称 TestOcr
* @remark
* @date 2017-11-24
*/
public class TestOcr {
public static void main(String[] args) throws Exception {
AipOcr aipOcr = new AipOcr("APPID", "APIKEY", "SECRETKEY");
String imgData = "G:/big2.jpg";
HashMap options= new HashMap();
JSONObject jsonObject = aipOcr.basicGeneral(imgData ,options);
System.out.println(jsonObject);
BaiDuOCRBean baiDuOCRBean = com.alibaba.fastjson.JSONObject.toJavaObject(JSON.parseObject(jsonObject.toString()), BaiDuOCRBean.class);
List list = baiDuOCRBean.getWords_result();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getWords());
}
}
}
- 返回的内容JSON字符串
{
"words_result": [
{
"words": "企业名称预先核准申请书填写说明"
},
{
"words": "注:以下“说明”供填写申请书参照使用,不需向登记机关提供"
},
{
"words": "1、本申请书适用于所有内资企业的名称预先核准申请、名称项目调整(投资人除外)"
},
{
"words": "名称延期申请等。"
},
{
"words": "2、向登记机关提交的申请书只填写与本次申请有关的栏目。"
},
{
"words": "3、申请人应根据《企业名称登记管理规定》和《企业名称登记管理实施办法》有关规"
},
{
"words": "定申请企业名称预先核准,所提供信息应真实、合法、有效。"
},
{
"words": "4、“企业类型”栏应根据以下具体类型选择填写:有限责任公司、股份有限公司、分"
},
{
"words": "公司、非公司企业法人、营业单位、企业非法人分支机构、个人独资企业、合伙企业。"
},
{
"words": "5、“经营范围”栏只需填写与企业名称行业表述相一致的主要业务项目,应参照《国"
},
{
"words": "民经济行业分类》国家标准及有关规定填写。"
},
{
"words": "6、申请企业设立名称预先核准、对已核准企业名称项目进行调整或延长有效期限的,"
},
{
"words": "申请人为全体投资人。其中,自然人投资的由本人签字,非自然人投资的加盖公章。"
},
{
"words": "7、在原核准名称不变的情况下,可以对已核准名称项目进行调整,如住所、注册资本"
},
{
"words": "(金)等,变更投资人项目的除外。"
},
{
"words": "8、《企业名称预先核准通知书》的延期应当在有效期期满前一个月内申请办理,申请"
},
{
"words": "延期时应缴回《全业名称预先核准通知书》原件。投资人有正当理由,可以申请《企业名称"
},
{
"words": "预先核准通知书》有效期延期六个月,经延期的《企业名称预先核准通知书》不得再次申请"
},
{
"words": "延期"
},
{
"words": "9、指定代表或委托代理人、具体经办人应在粘贴的身份证件复印件上用黑色钢笔或签"
},
{
"words": "字笔签字确认“与原件一致”。"
},
{
"words": "10、“投资人”项及“已核准名称项目调整(投资人除外)”项可加行续写或附页续写"
},
{
"words": "11、申请人提交的申请书应当使用A4型纸。依本表打印生成的,使用黑色钢笔或签字笔"
},
{
"words": "签署;手工填写的,使用黑色钢笔或签字笔工整填写、签署。"
}
],
"words_result_num": 24,
"log_id": 5860211020402440000
}
- 解析JSON后返回的只有words字段的内容
企业名称预先核准申请书填写说明
注:以下“说明”供填写申请书参照使用,不需向登记机关提供
1、本申请书适用于所有内资企业的名称预先核准申请、名称项目调整(投资人除外)
名称延期申请等。
2、向登记机关提交的申请书只填写与本次申请有关的栏目。
3、申请人应根据《企业名称登记管理规定》和《企业名称登记管理实施办法》有关规
定申请企业名称预先核准,所提供信息应真实、合法、有效。
4、“企业类型”栏应根据以下具体类型选择填写:有限责任公司、股份有限公司、分
公司、非公司企业法人、营业单位、企业非法人分支机构、个人独资企业、合伙企业。
5、“经营范围”栏只需填写与企业名称行业表述相一致的主要业务项目,应参照《国
民经济行业分类》国家标准及有关规定填写。
6、申请企业设立名称预先核准、对已核准企业名称项目进行调整或延长有效期限的,
申请人为全体投资人。其中,自然人投资的由本人签字,非自然人投资的加盖公章。
7、在原核准名称不变的情况下,可以对已核准名称项目进行调整,如住所、注册资本
(金)等,变更投资人项目的除外。
8、《企业名称预先核准通知书》的延期应当在有效期期满前一个月内申请办理,申请
延期时应缴回《全业名称预先核准通知书》原件。投资人有正当理由,可以申请《企业名称
预先核准通知书》有效期延期六个月,经延期的《企业名称预先核准通知书》不得再次申请
延期
9、指定代表或委托代理人、具体经办人应在粘贴的身份证件复印件上用黑色钢笔或签
字笔签字确认“与原件一致”。
10、“投资人”项及“已核准名称项目调整(投资人除外)”项可加行续写或附页续写
11、申请人提交的申请书应当使用A4型纸。依本表打印生成的,使用黑色钢笔或签字笔
签署;手工填写的,使用黑色钢笔或签字笔工整填写、签署。
- Java通过API方式请求通用文字识别接口并解析JSON字符串
import java.io.IOException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import org.json.JSONObject;
import pay.CMBC.BaiDuOCRBean.Words_result;
import com.alibaba.fastjson.JSON;
import com.baidu.aip.ocr.AipOcr;
import com.baidu.aip.util.Base64Util;
import com.juli.paymentmanager.util.HttpUtil;
import com.uitl.FileUtil;
/**
* @author 小帅丶
* @类名称 TestOcr
* @remark
* @date 2017-11-24
*/
public class TestOcr {
public static void main(String[] args) throws Exception {
String imgData = "G:/big2.jpg";
String url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=自己应用获取的token";
String base64 = Base64Util.encode(FileUtil.readFileByBytes(imgData));
String param = "image="+URLEncoder.encode(base64,"UTF-8")+"&language_type=CHN_ENG&detect_direction=true&detect_language=true&probability=true";
String result = HttpUtil.post(url, param);
BaiDuOCRBean baiDuOCRBean = com.alibaba.fastjson.JSONObject.toJavaObject(JSON.parseObject(result), BaiDuOCRBean.class);
List list = baiDuOCRBean.getWords_result();
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getWords());
}
}
}
- API传的参数多。返回的JSON内容更丰富。
{
"log_id": 8877206896837273000,
"direction": 0,
"words_result_num": 24,
"words_result": [
{
"words": "企业名称预先核准申请书填写说明",
"probability": {
"variance": 0.000038,
"average": 0.99629,
"min": 0.981279
}
},
{
"words": "注:以下“说明”供填写申请书参照使用用,不需向登记机关提供",
"probability": {
"variance": 0,
"average": 0.999711,
"min": 0.99635
}
},
{
"words": "1、本申请书适用于所有内资企业的名称预先核准申请、名称项目调整(投资人除外)",
"probability": {
"variance": 0.000036,
"average": 0.998041,
"min": 0.967467
}
},
{
"words": "名称延期申请等。",
"probability": {
"variance": 0,
"average": 0.999921,
"min": 0.999692
}
},
{
"words": "2、向登记机关提交的申请书只填写与本次申请有关的栏目。",
"probability": {
"variance": 0.000002,
"average": 0.99964,
"min": 0.993614
}
},
{
"words": "3、申请人应根据《企业名称登记管理规定》和《企业名称登记管理实施办法》有关规",
"probability": {
"variance": 0,
"average": 0.99987,
"min": 0.998576
}
},
{
"words": "定申请企业名称预先核准,所提供信息应真实、合法、有效。",
"probability": {
"variance": 0,
"average": 0.999918,
"min": 0.999155
}
},
{
"words": "4、“企业类型”栏应根据以下具体类型选择填写:有限责任公司、股份有限公司、分",
"probability": {
"variance": 0.000002,
"average": 0.999533,
"min": 0.992644
}
},
{
"words": "公司、非公司企业法人、营业业单位、企业非法人分支机构、个人独资企业、合伙企业。",
"probability": {
"variance": 0.000009,
"average": 0.998969,
"min": 0.986941
}
},
{
"words": "5、“经营范围”栏只需填写与企业名称行业表述相一致的主要业务项目,应参照照《国",
"probability": {
"variance": 0.000002,
"average": 0.99954,
"min": 0.990742
}
},
{
"words": "民经济行业分类》国家标准及有关规定填写。",
"probability": {
"variance": 0,
"average": 0.999818,
"min": 0.998759
}
},
{
"words": "6、申请企业设立名称预先核准、对已核准企业名称项目进行调整或延长有效期限的,",
"probability": {
"variance": 0.00071,
"average": 0.993425,
"min": 0.840738
}
},
{
"words": "申请人为全体投资人。其中,自然人投资的由本人签字,非自然人投资的加盖公章。",
"probability": {
"variance": 0,
"average": 0.999625,
"min": 0.99754
}
},
{
"words": "7、在原核准名称不变的情况下,可以对己核准名称项目进行调整,如住所、注册资本",
"probability": {
"variance": 0.005251,
"average": 0.98353,
"min": 0.575357
}
},
{
"words": "(金)等,变更投资人项目的除外。",
"probability": {
"variance": 0.000002,
"average": 0.998811,
"min": 0.995471
}
},
{
"words": "8、《企业名称预先核准通知书》的延期应当在有效期期满前一个月内申请办理,申请",
"probability": {
"variance": 0,
"average": 0.99981,
"min": 0.997269
}
},
{
"words": "延期时应缴回《企业名称预先核准通知书》原件。投资人有正当理由,可以申请《企业名称",
"probability": {
"variance": 0.001316,
"average": 0.992622,
"min": 0.769052
}
},
{
"words": "预先核准通知书》有效期延期六个月,经延期的《企业名称预先核准通知书》不得再次申请",
"probability": {
"variance": 0.001129,
"average": 0.993042,
"min": 0.785771
}
},
{
"words": "延期",
"probability": {
"variance": 0,
"average": 0.999716,
"min": 0.999584
}
},
{
"words": "指定代表或委托代理人、具体经办人应在粘贴的身份证件复印件上用黑色钢笔或签",
"probability": {
"variance": 0.000001,
"average": 0.999669,
"min": 0.994517
}
},
{
"words": "字笔签字确认“与原件一致”。",
"probability": {
"variance": 0.000002,
"average": 0.999261,
"min": 0.995568
}
},
{
"words": "10、“投资人”项及“已核准名称项目调整(投资人除外外)”项可加行续写或附页续写",
"probability": {
"variance": 0.000114,
"average": 0.997625,
"min": 0.931265
}
},
{
"words": "11、申请人提交的申请书应当使用A4型纸。依本表打印生成的,使用用黑色钢笔或签字笔",
"probability": {
"variance": 0.005255,
"average": 0.986583,
"min": 0.529887
}
},
{
"words": "签署;手工填写的,使用黑色钢笔或签字笔工整填写、签署。",
"probability": {
"variance": 0.000019,
"average": 0.998177,
"min": 0.980623
}
}
],
"language": 3
}
只读取words内容和上面的是一样的。就不重复显示了
- 用到的Java对象(具体含义自行查看文档)
import java.util.List;
/**
* @author 小帅丶
* @类名称 BaiDuOCRBean
* @remark
* @date 2017-11-27
*/
public class BaiDuOCRBean {
private Long log_id;
private int direction;
private int words_result_num;
private List words_result;
private int language;
/**
* @return the log_id
*/
public Long getLog_id() {
return log_id;
}
/**
* @param log_id
* log_id
*/
public void setLog_id(Long log_id) {
this.log_id = log_id;
}
/**
* @return the direction
*/
public int getDirection() {
return direction;
}
/**
* @param direction
* direction
*/
public void setDirection(int direction) {
this.direction = direction;
}
/**
* @return the words_result_num
*/
public int getWords_result_num() {
return words_result_num;
}
/**
* @param words_result_num
* words_result_num
*/
public void setWords_result_num(int words_result_num) {
this.words_result_num = words_result_num;
}
/**
* @return the words_result
*/
public List getWords_result() {
return words_result;
}
/**
* @param words_result
* words_result
*/
public void setWords_result(List words_result) {
this.words_result = words_result;
}
/**
* @return the language
*/
public int getLanguage() {
return language;
}
/**
* @param language
* language
*/
public void setLanguage(int language) {
this.language = language;
}
public static class Words_result{
private String words;
private Probability probability;
/**
* @return the words
*/
public String getWords() {
return words;
}
/**
* @param words
* words
*/
public void setWords(String words) {
this.words = words;
}
/**
* @return the probability
*/
public Probability getProbability() {
return probability;
}
/**
* @param probability
* probability
*/
public void setProbability(Probability probability) {
this.probability = probability;
}
public static class Probability{
private double variance;
private double average;
private double min;
/**
* @return the variance
*/
public double getVariance() {
return variance;
}
/**
* @param variance
* variance
*/
public void setVariance(double variance) {
this.variance = variance;
}
/**
* @return the average
*/
public double getAverage() {
return average;
}
/**
* @param average
* average
*/
public void setAverage(double average) {
this.average = average;
}
/**
* @return the min
*/
public double getMin() {
return min;
}
/**
* @param min
* min
*/
public void setMin(double min) {
this.min = min;
}
}
}
}
- 用到的工具类分别是Base64Util、FileUtil、HttpUtil 下载地址:
http://aixiaoshuai.mydoc.io/?t=234826
TOP
切换版块
SDK封装的方法名称 都会对应一个接口名称的。看SDK文档就行。
maven引入更好说了。你点击进去会自动下载源码。有中文注释。一看便知。
楼主厉害。
谢谢,看到了,非常感谢,才反应过来-.-
你调用方法名【basicGeneral】就标识着这个是通用识别;高精度识别的方法是【basicAccurateGeneral】,好好看文档
我看我的百度智能云里面的管理应用,有的时候调用的是“通用文字识别”有的时候是“通用文字识别(高精度版)”,所以这地方有点糊涂
谢谢您回复我,我再咨询您一下哈,我先是引入了maven依赖,然后就是跟官网一样写了是一个Sample类,然后Sample类里面的main方法里调用接口
// 调用接口 String path = "test.jpg"; JSONObject res = client.basicGeneral(path, new HashMap()); System.out.println(res.toString(2));
然后就成功能调用接口并返回,但是我有一点不明白,他是怎么确定“通用文字识别”或者“通用文字识别(高精度版)”或者其他版的,我完全没有设置,官网示例代码只是对应每种版本给了一个有参构造器,我没写这个构造器一样是好用的,所以有点不明白,还有如果是要写构造器的话,构造器里面的
// 参数为本地路径 String image = "test.jpg";
这个是怎么确定的呢,本人接触时间不长,研究好长时间,还是不太懂,麻烦您了,您再帮着看一下,十分感谢您,好人一生平安-.-
示例代码有啥不懂的。你用啥接口 调用SDK封装的方法就行。当然需要自己有编程经验。刚入门的肯定会看的稀里糊涂的。
https://github.com/Baidu-AIP 各个语言的SDK代码是开源的。也有中文注释。
楼主你好,我想问一下,导入SDK后,是自动使用普通文字识别么,如果我想用“通用文字识别(含位置高精度版)”,需要在哪写,官网给的,我有点没看懂
楼主回复好及时啊
可以这样试试哦。
通用文字识别(含位置高精度版)中的json数据就有这种情况有个叫做char的属性
请问再使用阿里的fastjson进行json转对象的时候,json里的字段有的名称是char这种关键字,在创建bean对象时应该怎么处理。
示例如此清楚规范
问:这些识别后的数据都是输出在控制台的,
答:如果你是Java 用System.out.print();那是会打印在控制台了哦。
-----------------------------------------------------------------------
问:怎么把它们传到前台啊?
答:这个要看你会什么JavaEE框架了。SpringBoot|SpringMVC等等一系列的框架都可以返回。
这一步的jsonObject.直接返回页面就行了。具体怎么操作。这个需要看你会什么框架了。这一步呢已经不属于人家百度AI接口的事情了。
-----------------------------------------------------------------------
问:还有就是,这也只能识别硬盘中固定存在的图片,有什么方法能从数据库中读取图片 并识别文字信息啊?
答:这一步我只能说肯定是你的事情。和百度AI接口没关系。我这个只是调用接口示例代码。而不是业务处理。从数据库选择图片(要么是存了图片的base64.要么是图片的本地路径)任期一个即可。拿到请求接口即可。如果是base64且是API调用不需要做处理。如果是SDK调用需要decode一下。希望你有过相关的实际经验就肯定明白如何操作。
这些识别后的数据都是输出在控制台的,怎么把它们传到前台啊?还有就是,这也只能识别硬盘中固定存在的图片,有什么方法能从数据库中读取图片 并识别文字信息啊?求大神赐教!
什么错误分享下,少采坑。
纠正了我一个错误!
楼主您好,请问如何识别单个字,我发现使用过程中如果写一个字的话会识别成多个字
http://ai.baidu.com/forum/topic/show/892244 麻烦看这篇帖子。
楼主不好意思了,我是一个初学者,请问一下import com.baidu.aip.ocr.AipOcr;这个jar一般来说要去哪里下载呀