【通用文字识别】Java示例解析JSON转对象
用户已被禁言 发布于2017-11 浏览:27244 回复:93
7
收藏

好多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

 

 

收藏
点赞
7
个赞
共93条回复 最后由kzyoyo回复于2022-05
#38持斧傲如你爹回复于2018-01

我想单独拿到集合里面的属性,该怎么做?求解

0
#37荒墨丶迷失回复于2018-01
该评论已删除

社区里有好多好多棒的 等待着你去发现呢 hhh

0
#35shoranxfyzhy回复于2018-01
#34 荒墨丶迷失回复
驼峰法。很耳熟呢

对呀,好多语言都用这种命名,在代码中能够快速识别其命名涵义。

0
#34荒墨丶迷失回复于2017-12
#33 shoranxfyzhy回复
嗯,鼎鼎大名的驼峰命名法呢

驼峰法。很耳熟呢

1
#33shoranxfyzhy回复于2017-12
#32 daipeng_hi回复
实例中命名规范还不太好呀

嗯,鼎鼎大名的驼峰命名法呢

0
#32daipeng_hi回复于2017-12

实例中命名规范还不太好呀

0
#31daipeng_hi回复于2017-12
#30 在南京工程学院回复
我还有个问题,想知道sdk是否支持url格式,我用了七牛云上的url试了下,就报错了,但是本地的图片是没有任何问题的
展开

如果不支持也不要紧了,你自己把图片down下来也可以呀;

0
#30在南京工程学院回复于2017-12

我还有个问题,想知道sdk是否支持url格式,我用了七牛云上的url试了下,就报错了,但是本地的图片是没有任何问题的

0
#29meihysmile回复于2017-12

好东西啊

0
#28在南京工程学院回复于2017-12

好的,那我咨询下,非常感谢楼主了

0
#27用户已被禁言回复于2017-12
#26 在南京工程学院回复
还有个问题,就是空格好像识别不出来,想问下有没有什么相对比较好的解决办法
展开

接口的能力问题。最好咨询百度官方哦。

1
#26在南京工程学院回复于2017-12

还有个问题,就是空格好像识别不出来,想问下有没有什么相对比较好的解决办法

0
#25在南京工程学院回复于2017-12

我看懂了。再次谢谢楼主的解答

0
#24在南京工程学院回复于2017-12

words_result这个一直报红,找不到这个东西,谢谢楼主回复我

0
#23用户已被禁言回复于2017-12
#22 在南京工程学院回复
想问一下你使用的是不是付费版呀。然后那个BaiDuOCRBean是自己写的,还是本身那个jar包里面就有的呀
展开

免费的。java对象自己写的。返回的JSON可以百度一个在线转javabean的网站。

IntelliJ IDEA 可以安装一个插件。也可以JSON生成javabean对象的。

1
#22在南京工程学院回复于2017-12

想问一下你使用的是不是付费版呀。然后那个BaiDuOCRBean是自己写的,还是本身那个jar包里面就有的呀

0
#21用户已被禁言回复于2017-12
#20 任意64回复
api调用和sdk哪个好(占用服务端的资源少)

API需要你自己管理token的有效期。每个接口URL也需要你自己建个类保存起来。代码量都差不多。

SDK并不需要你自己管理。而且所有模块之前调用都封装好了。

占用服务端资源不知道你是说什么。代码是占用不了多少空间都。

0
#20任意64回复于2017-12

api调用和sdk哪个好(占用服务端的资源少)

0
#19没了没了没了靠回复于2017-12

我试了下官网的demo,它识别后有返回每一个字的位置,就像我前面发的那个一样:{"char": "察", "location": {"width": 18, "top": 31, "height": 19, "left": 303}}。按理说可以让它恢复成有格式(间距)的文本,但是不会弄。那我继续查资料啦,谢谢你的回答。我再问问官方。

0
#18用户已被禁言回复于2017-12
#17 没了没了没了靠回复
你写的这个帖子解析出的文字没有格式,比如标题前面有一段空格,你这个例子解析出来的就没有。我想用“通用文字识别(含位置信息版)”这个接口把文章及它的格式完整地识别出来,,不知道有没有说清楚。
展开

哦。接口并不会返回格式吧。你这个估计想直接拿识别出来位置填充到指定到位置估计。而且还需要原图字体的格式之类?

这个貌似接口暂时不支持吧。当然你也可以问问官方的pm。

 

1
TOP
切换版块