当前位置:   article > 正文

JAVA开发(byte和string转换类型的坑)_java byte string

java byte string

背景:

最近真实遇到的问题,所以在此做个总结。byte和string转换类型的坑。因为我要把数据缓存到redis,所以不得不将byte类型数据先转换成string。然后获取数据的时候,又将string类型数据转换成byte。

网上给我的参考:

这里的坑就在于编码的问题。

上面这个指定的是UTF-8的编码。但是转换却是有问题的,出来的结果不一致。

解决方案:

编码使用:ISO-8859-1

  1. // 为了保证性能,先从缓存中取,设置2小时有效期
  2. String keyId = param.get("scene").toString();
  3. Base64.Encoder encoder = Base64.getMimeEncoder();
  4. if (!StringUtils.isEmpty(keyId)) {
  5. String strCache = memberCacheService.wxacodeunCache(keyId);
  6. if (!StringUtils.isEmpty(strCache)) {
  7. byte[] bytes = strCache.getBytes(StandardCharsets.ISO_8859_1);
  8. return bytes;
  9. }
  10. }
  11. Map<String, Object> map = getQRToken();
  12. // 后端服务获取的access_token
  13. String accessToken = map.get("access_token").toString();
  14. log.info("获取到的微信服务端:accessToken:" + accessToken);
  15. log.info("获取微信二维码请求参数param:" + JSON.toJSONString(param));
  16. byte[] resbyte = wxClient.getwxacodeunlimit(accessToken, param);
  17. encoder.encodeToString(resbyte);
  18. //log.info("获取微信二维码 str:" + str);
  19. try {
  20. if (!StringUtils.isEmpty(keyId)) {
  21. log.info("当前分享推荐码用户userId:" + keyId);
  22. memberCacheService.wxacodeunCahe(keyId, new String(resbyte,StandardCharsets.ISO_8859_1));
  23. }
  24. } catch (Exception e) {
  25. log.info("获取微信二维码字节码异常:" + e.getMessage() );
  26. }
  27. return resbyte;

返回结果样例:

HIOOcf/AKx/nk8ZzJITGSVJGPfnj19On8uld9faa0ZICnHXp7c855HBHQ4PfoBzNxbkEggHqQccH07YHb8/bA7KOIfMlJq99r9rfh5PbfzX1GFxkKsVaXPFtavXe1utlppp0Vr6noPwi+OvxL+CnivTPFXgfxTq2nS2F1DLc6cL24k0vU7ZHBlsr+xeQ288E0e5CGTcm7ejKwDD+wD4Q+P7X4pfDPwR8QbOIwQ+LPDmm6z5BO7yJrqBTcwBuhENyssanuFz3r+KZ4G8xUVeXYIo5+8xIUf99YH9K/su/Zo8Of8ACJfAP4R+H9nltYeAfDfmxkYKT3GnQ3U6kcdJp37fjX97fQvzjPMRmPF2VVcbXr5DhsvwGMp4atVnUp4XMa2JqUozw8ZScaSr0I1VWjBJVJQpyd5RZ/AP07sk4dw+WcEZ5RwGFocRY3M8xwVTGUKVOlWxeWUcJSrThipQjGVd4fESw7oSqNunGpWirqSS9yooor+/j/N8+dv2qP2r/gF+xX8FfFX7QX7SnxD0n4a/C7wikKahrmpiaee+1O88xdK8PaFptpHNfaz4h1qeM2uk6TYwyXF3PnhIkllj/gy/4KD/APB5r8T/ABnb+JPh7/wTv+DkPwq0maa6sLL48/GBLHxF46nsCnlLqPhn4cQLP4Y8NXkj75ba48Ral4reOIxGTSra4DBP6gv+Dgz/AIJh/Fn/AIKofsP6f8GPgX4p0HQPit8PfinoPxV8LaT4v1e90Xwl4xOl6J4g0DUfDmq6ha2t9HY3stlr8l3ol/eWclrb6hbCG4ntLa7nuE/kw/Yp/wCDMb9qz4g62utftxfGPwX8APBVneWbHwj8Lrq0+KHxE8R2m6KW8iTVs2XhDwopiMtvFezS+JblbhS7aQYAksgB/Jt8Yv2gP2o/20viZa+IvjR8Tvi3+0T8UdfvTY6MPE2s+IPG+uTXOoXTSR6R4Y0UNdrYwzXMxW00bQLC2tk3JDbWioqIP6F/+CfH/Bpp/wAFBP2s7fw34+/aGbSv2OfhDqs1tdTR/ECzuNV+M+p6LKnnG50f4ZWjQ/2NLOm2OH/hNtY8PXUTSrOdLuYkKP8A6FX7Cf8AwSL/AGBv+CdPhyx0v9m74C+F9O8WwxQjU/i54xtLbxl8W9du4omje8vPG2sW8t9pok8yU/2d4dTRdIhErpDYRqxz+ldAH4r/APBP3/ggL/wTa/4J3v4f8U/DT4M2vxJ+NGiW0APxx+Mrw+N/GyalExkfVPDthdwp4W8FXJlY+RN4W0PTr+GFY4X1C4KGRv2oorznxt8YPhN8NL/QdL+I3xP+HvgLU/FN39g8M6d4z8ZeHfDF94gvcE/ZdFtda1Gyn1OfjBjs45mDFVI3MoIB6NRTUdJEWSNldHVXR0YMjowDKyspIZWBBVgSCCCDg1/BL/wW9/4OnP2mP2aP2r/i3+xz+xH4Q+H/AIST4Ja5N4J8c/Gbx5ozeNte13xfFp9hPq1v4Q8OXU1n4f0PTdBu7q60z7Zq1v4hudTu7UXkSafAn2ecA/vTvL2z062lvNQu7Wxs4F3TXV5cRWttCpIAaWed0ijUkgZdgMkDqa+MYv8AgpJ/wT+n+KFr8FoP2z/2aLj4qXt4NNtPBFv8ZPAs+tT6m0ywJpUccWtPAdWklZUi0szjUJdwaO2dSDX+Ob+1B/wU7/b+/bNnlP7SX7V/xj+JWlyTy3EfhW78VXeh+CLZ5LuS9C2vgnwyNG8LRJDPJ/o2NJLwRRW8MbrFbW6R5/7IH/BPH9tj9tnx/wCFvCn7M3wB+J/ja51rVbZIPHNp4c1bS/AXh4RzeZJreufELUILLwvotnp3lNO9zc6vFKZkjt7ZZbya3hkAP9xdnVEaQklFQuSoLkqBuJVUDMxwOAoJbooJIFf56PxT/wCDx79o/wAHft1+J/BGgfs7fCi6/ZT8G/GDWvhvc6HqcPiuL4wa34W0XxbL4bu/Fo8QLrUWlaX4nktbObU7Pw83hubT4ZZf7LvJppMX0P8AfT8HfCviPwL8JPhd4K8YeIJfFni3wh8PPBfhjxP4onO6bxF4g0Hw5pul6xrcrbELvqmoWtxes7IHczF5PnLE/jV4v/4Nvf8AglH44/a0uf2w9e+CGvS+PtR8bS/ErWvBVt47161+E2t+P5tXTXpfEuo+CopApabWBJqN1otrqNt4cvLmVxc6RJbs1uwB+5Wjarba5o+la3ZCZbPWNNsdVtFuIZLe4FtqFrFdwCe3lVZYJhFMglhlVZIn3I6hlIGlTURI0WONVREVUREUKiIoCqqqoAVVAAVQAAAABgVzfiPxr4N8H25u/F3i3wz4WtQ9rGbnxHr2laJbiS+uksrJDNqd3ax77y9ljtLVd264upEt4Q8rqhAOmoqOKaK4ijngljmhmRZIponWSKWNwGSSORCyOjKQyspKsCCCQakoAKKKKACiiigD+ff/AILL/wDBwX8BP+CQ3iTwX8KNX+Ffi746/HXx94Qk8daZ4L0DXNL8KeHPD3hhtTvNH07UvF3ii+t9VvLR9Y1DTtRi06x0vw/qc8kNjc3M726LClx+cXwd/wCD039gHxbLZ2nxj/Z8/aP+EE89xZwXOpaRbeDfiXodpHJa+ZfX0z6drnh/XDb294Db28Frod7d3MLJcPHAd8S/YH/BdT/g3c8P/wDBW/xr4H+PPw7+NFp8EPj74I8GQfD27l8R+G7jxF4E8c+FLTWL7V9MTWxpl1a61pGtaJLqupxWOpWUeoQ3VrcR2d5Zhbe3uYf5BPiv/wAGgX/BXPwAl7c+DdN+AHxmtbTTftyr4H+LMej6je3P2iSL+ybPT/iBofhAPfiJY7kvLcw2HlyhFvWljdAAf3CfAr/g5T/4I3fHq+0fR9I/a20j4da9rTeXbaR8ZvCXi/4a+TcPqUemW1t

我们可以通过工具进行解码渲染成图片:

二、java中对象和JSON之间的转换

使用JSONUtil工具类:该类在cn.hutool.json下

  1. package cn.hutool.json;
  2. import cn.hutool.core.io.IORuntimeException;
  3. import cn.hutool.core.io.file.FileReader;
  4. import cn.hutool.core.lang.TypeReference;
  5. import cn.hutool.core.util.ArrayUtil;
  6. import cn.hutool.core.util.ClassUtil;
  7. import cn.hutool.core.util.HexUtil;
  8. import cn.hutool.core.util.ObjectUtil;
  9. import cn.hutool.core.util.StrUtil;
  10. import cn.hutool.core.util.TypeUtil;
  11. import cn.hutool.json.serialize.GlobalSerializeMapping;
  12. import cn.hutool.json.serialize.JSONArraySerializer;
  13. import cn.hutool.json.serialize.JSONDeserializer;
  14. import cn.hutool.json.serialize.JSONObjectSerializer;
  15. import cn.hutool.json.serialize.JSONSerializer;
  16. import java.io.File;
  17. import java.io.IOException;
  18. import java.io.StringWriter;
  19. import java.io.Writer;
  20. import java.lang.reflect.Type;
  21. import java.nio.charset.Charset;
  22. import java.sql.SQLException;
  23. import java.time.temporal.TemporalAccessor;
  24. import java.util.Calendar;
  25. import java.util.Date;
  26. import java.util.Iterator;
  27. import java.util.List;
  28. import java.util.Map;
  29. /**
  30. * JSON工具类
  31. *
  32. * @author Looly
  33. */
  34. public class JSONUtil {
  35. // -------------------------------------------------------------------- Pause start
  36. /**
  37. * 创建JSONObject
  38. *
  39. * @return JSONObject
  40. */
  41. public static JSONObject createObj() {
  42. return new JSONObject();
  43. }
  44. /**
  45. * 创建JSONObject
  46. *
  47. * @param config JSON配置
  48. * @return JSONObject
  49. * @since 5.2.5
  50. */
  51. public static JSONObject createObj(JSONConfig config) {
  52. return new JSONObject(config);
  53. }
  54. /**
  55. * 创建 JSONArray
  56. *
  57. * @return JSONArray
  58. */
  59. public static JSONArray createArray() {
  60. return new JSONArray();
  61. }
  62. /**
  63. * 创建 JSONArray
  64. *
  65. * @param config JSON配置
  66. * @return JSONArray
  67. * @since 5.2.5
  68. */
  69. public static JSONArray createArray(JSONConfig config) {
  70. return new JSONArray(config);
  71. }
  72. /**
  73. * JSON字符串转JSONObject对象
  74. *
  75. * @param jsonStr JSON字符串
  76. * @return JSONObject
  77. */
  78. public static JSONObject parseObj(String jsonStr) {
  79. return new JSONObject(jsonStr);
  80. }
  81. /**
  82. * JSON字符串转JSONObject对象<br>
  83. * 此方法会忽略空值,但是对JSON字符串不影响
  84. *
  85. * @param obj Bean对象或者Map
  86. * @return JSONObject
  87. */
  88. public static JSONObject parseObj(Object obj) {
  89. return new JSONObject(obj);
  90. }
  91. /**
  92. * JSON字符串转JSONObject对象<br>
  93. * 此方法会忽略空值,但是对JSON字符串不影响
  94. *
  95. * @param obj Bean对象或者Map
  96. * @param config JSON配置
  97. * @return JSONObject
  98. * @since 5.3.1
  99. */
  100. public static JSONObject parseObj(Object obj, JSONConfig config) {
  101. return new JSONObject(obj, config);
  102. }
  103. /**
  104. * JSON字符串转JSONObject对象
  105. *
  106. * @param obj Bean对象或者Map
  107. * @param ignoreNullValue 是否忽略空值,如果source为JSON字符串,不忽略空值
  108. * @return JSONObject
  109. * @since 3.0.9
  110. */
  111. public static JSONObject parseObj(Object obj, boolean ignoreNullValue) {
  112. return new JSONObject(obj, ignoreNullValue);
  113. }
  114. /**
  115. * JSON字符串转JSONObject对象
  116. *
  117. * @param obj Bean对象或者Map
  118. * @param ignoreNullValue 是否忽略空值,如果source为JSON字符串,不忽略空值
  119. * @param isOrder 是否有序
  120. * @return JSONObject
  121. * @since 4.2.2
  122. */
  123. public static JSONObject parseObj(Object obj, boolean ignoreNullValue, boolean isOrder) {
  124. return new JSONObject(obj, ignoreNullValue, isOrder);
  125. }
  126. /**
  127. * JSON字符串转JSONArray
  128. *
  129. * @param jsonStr JSON字符串
  130. * @return JSONArray
  131. */
  132. public static JSONArray parseArray(String jsonStr) {
  133. return new JSONArray(jsonStr);
  134. }
  135. /**
  136. * JSON字符串转JSONArray
  137. *
  138. * @param arrayOrCollection 数组或集合对象
  139. * @return JSONArray
  140. * @since 3.0.8
  141. */
  142. public static JSONArray parseArray(Object arrayOrCollection) {
  143. return new JSONArray(arrayOrCollection);
  144. }
  145. /**
  146. * JSON字符串转JSONArray
  147. *
  148. * @param arrayOrCollection 数组或集合对象
  149. * @param config JSON配置
  150. * @return JSONArray
  151. * @since 5.3.1
  152. */
  153. public static JSONArray parseArray(Object arrayOrCollection, JSONConfig config) {
  154. return new JSONArray(arrayOrCollection, config);
  155. }
  156. /**
  157. * JSON字符串转JSONArray
  158. *
  159. * @param arrayOrCollection 数组或集合对象
  160. * @param ignoreNullValue 是否忽略空值
  161. * @return JSONArray
  162. * @since 3.2.3
  163. */
  164. public static JSONArray parseArray(Object arrayOrCollection, boolean ignoreNullValue) {
  165. return new JSONArray(arrayOrCollection, ignoreNullValue);
  166. }
  167. /**
  168. * 转换对象为JSON<br>
  169. * 支持的对象:<br>
  170. * String: 转换为相应的对象<br>
  171. * Array Collection:转换为JSONArray<br>
  172. * Bean对象:转为JSONObject
  173. *
  174. * @param obj 对象
  175. * @return JSON
  176. */
  177. public static JSON parse(Object obj) {
  178. if(obj instanceof JSON){
  179. return (JSON) obj;
  180. }
  181. final JSONConfig config = JSONConfig.create();
  182. if(InternalJSONUtil.isOrder(obj)){
  183. config.setOrder(true);
  184. }
  185. return parse(obj, config);
  186. }
  187. /**
  188. * 转换对象为JSON<br>
  189. * 支持的对象:<br>
  190. * String: 转换为相应的对象<br>
  191. * Array、Iterable、Iterator:转换为JSONArray<br>
  192. * Bean对象:转为JSONObject
  193. *
  194. * @param obj 对象
  195. * @param config JSON配置
  196. * @return JSON
  197. * @since 5.3.1
  198. */
  199. public static JSON parse(Object obj, JSONConfig config) {
  200. if (null == obj) {
  201. return null;
  202. }
  203. JSON json;
  204. if (obj instanceof JSON) {
  205. json = (JSON) obj;
  206. } else if (obj instanceof CharSequence) {
  207. final String jsonStr = StrUtil.trim((CharSequence) obj);
  208. json = isJsonArray(jsonStr) ? parseArray(jsonStr, config) : parseObj(jsonStr, config);
  209. } else if (obj instanceof Iterable || obj instanceof Iterator || ArrayUtil.isArray(obj)) {// 列表
  210. json = new JSONArray(obj, config);
  211. } else {// 对象
  212. json = new JSONObject(obj, config);
  213. }
  214. return json;
  215. }
  216. /**
  217. * XML字符串转为JSONObject
  218. *
  219. * @param xmlStr XML字符串
  220. * @return JSONObject
  221. */
  222. public static JSONObject parseFromXml(String xmlStr) {
  223. return XML.toJSONObject(xmlStr);
  224. }
  225. // -------------------------------------------------------------------- Pause end
  226. // -------------------------------------------------------------------- Read start
  227. /**
  228. * 读取JSON
  229. *
  230. * @param file JSON文件
  231. * @param charset 编码
  232. * @return JSON(包括JSONObject和JSONArray)
  233. * @throws IORuntimeException IO异常
  234. */
  235. public static JSON readJSON(File file, Charset charset) throws IORuntimeException {
  236. return parse(FileReader.create(file, charset).readString());
  237. }
  238. /**
  239. * 读取JSONObject
  240. *
  241. * @param file JSON文件
  242. * @param charset 编码
  243. * @return JSONObject
  244. * @throws IORuntimeException IO异常
  245. */
  246. public static JSONObject readJSONObject(File file, Charset charset) throws IORuntimeException {
  247. return parseObj(FileReader.create(file, charset).readString());
  248. }
  249. /**
  250. * 读取JSONArray
  251. *
  252. * @param file JSON文件
  253. * @param charset 编码
  254. * @return JSONArray
  255. * @throws IORuntimeException IO异常
  256. */
  257. public static JSONArray readJSONArray(File file, Charset charset) throws IORuntimeException {
  258. return parseArray(FileReader.create(file, charset).readString());
  259. }
  260. // -------------------------------------------------------------------- Read end
  261. // -------------------------------------------------------------------- toString start
  262. /**
  263. * 转为JSON字符串
  264. *
  265. * @param json JSON
  266. * @param indentFactor 每一级别的缩进
  267. * @return JSON字符串
  268. */
  269. public static String toJsonStr(JSON json, int indentFactor) {
  270. if (null == json) {
  271. return null;
  272. }
  273. return json.toJSONString(indentFactor);
  274. }
  275. /**
  276. * 转为JSON字符串
  277. *
  278. * @param json JSON
  279. * @return JSON字符串
  280. */
  281. public static String toJsonStr(JSON json) {
  282. if (null == json) {
  283. return null;
  284. }
  285. return json.toJSONString(0);
  286. }
  287. /**
  288. * 转为JSON字符串,并写出到write
  289. *
  290. * @param json JSON
  291. * @param writer Writer
  292. * @since 5.3.3
  293. */
  294. public static void toJsonStr(JSON json, Writer writer) {
  295. if (null != json) {
  296. json.write(writer);
  297. }
  298. }
  299. /**
  300. * 转为JSON字符串
  301. *
  302. * @param json JSON
  303. * @return JSON字符串
  304. */
  305. public static String toJsonPrettyStr(JSON json) {
  306. if (null == json) {
  307. return null;
  308. }
  309. return json.toJSONString(4);
  310. }
  311. /**
  312. * 转换为JSON字符串
  313. *
  314. * @param obj 被转为JSON的对象
  315. * @return JSON字符串
  316. */
  317. public static String toJsonStr(Object obj) {
  318. if (null == obj) {
  319. return null;
  320. }
  321. if (obj instanceof CharSequence) {
  322. return StrUtil.str((CharSequence) obj);
  323. }
  324. return toJsonStr(parse(obj));
  325. }
  326. /**
  327. * 转换为JSON字符串并写出到writer
  328. *
  329. * @param obj 被转为JSON的对象
  330. * @param writer Writer
  331. * @since 5.3.3
  332. */
  333. public static void toJsonStr(Object obj, Writer writer) {
  334. if (null != obj) {
  335. toJsonStr(parse(obj), writer);
  336. }
  337. }
  338. /**
  339. * 转换为格式化后的JSON字符串
  340. *
  341. * @param obj Bean对象
  342. * @return JSON字符串
  343. */
  344. public static String toJsonPrettyStr(Object obj) {
  345. return toJsonPrettyStr(parse(obj));
  346. }
  347. /**
  348. * 转换为XML字符串
  349. *
  350. * @param json JSON
  351. * @return XML字符串
  352. */
  353. public static String toXmlStr(JSON json) {
  354. return XML.toXml(json);
  355. }
  356. // -------------------------------------------------------------------- toString end
  357. // -------------------------------------------------------------------- toBean start
  358. /**
  359. * JSON字符串转为实体类对象,转换异常将被抛出
  360. *
  361. * @param <T> Bean类型
  362. * @param jsonString JSON字符串
  363. * @param beanClass 实体类对象
  364. * @return 实体类对象
  365. * @since 3.1.2
  366. */
  367. public static <T> T toBean(String jsonString, Class<T> beanClass) {
  368. return toBean(parseObj(jsonString), beanClass);
  369. }
  370. /**
  371. * 转为实体类对象,转换异常将被抛出
  372. *
  373. * @param <T> Bean类型
  374. * @param json JSONObject
  375. * @param beanClass 实体类对象
  376. * @return 实体类对象
  377. */
  378. public static <T> T toBean(JSONObject json, Class<T> beanClass) {
  379. return null == json ? null : json.toBean(beanClass);
  380. }
  381. /**
  382. * JSON字符串转为实体类对象,转换异常将被抛出
  383. *
  384. * @param <T> Bean类型
  385. * @param jsonString JSON字符串
  386. * @param typeReference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型
  387. * @param ignoreError 是否忽略错误
  388. * @return 实体类对象
  389. * @since 4.3.2
  390. */
  391. public static <T> T toBean(String jsonString, TypeReference<T> typeReference, boolean ignoreError) {
  392. return toBean(jsonString, typeReference.getType(), ignoreError);
  393. }
  394. /**
  395. * JSON字符串转为实体类对象,转换异常将被抛出
  396. *
  397. * @param <T> Bean类型
  398. * @param jsonString JSON字符串
  399. * @param beanType 实体类对象类型
  400. * @param ignoreError 是否忽略错误
  401. * @return 实体类对象
  402. * @since 4.3.2
  403. */
  404. public static <T> T toBean(String jsonString, Type beanType, boolean ignoreError) {
  405. return toBean(parse(jsonString), beanType, ignoreError);
  406. }
  407. /**
  408. * 转为实体类对象
  409. *
  410. * @param <T> Bean类型
  411. * @param json JSONObject
  412. * @param typeReference {@link TypeReference}类型参考子类,可以获取其泛型参数中的Type类型
  413. * @param ignoreError 是否忽略转换错误
  414. * @return 实体类对象
  415. * @since 4.6.2
  416. */
  417. public static <T> T toBean(JSON json, TypeReference<T> typeReference, boolean ignoreError) {
  418. return toBean(json, typeReference.getType(), ignoreError);
  419. }
  420. /**
  421. * 转为实体类对象
  422. *
  423. * @param <T> Bean类型
  424. * @param json JSONObject
  425. * @param beanType 实体类对象类型
  426. * @param ignoreError 是否忽略转换错误
  427. * @return 实体类对象
  428. * @since 4.3.2
  429. */
  430. public static <T> T toBean(JSON json, Type beanType, boolean ignoreError) {
  431. if (null == json) {
  432. return null;
  433. }
  434. return json.toBean(beanType, ignoreError);
  435. }
  436. // -------------------------------------------------------------------- toBean end
  437. /**
  438. * 将JSONArray字符串转换为Bean的List,默认为ArrayList
  439. *
  440. * @param <T> Bean类型
  441. * @param jsonArray JSONArray字符串
  442. * @param elementType List中元素类型
  443. * @return List
  444. * @since 5.5.2
  445. */
  446. public static <T> List<T> toList(String jsonArray, Class<T> elementType) {
  447. return toList(parseArray(jsonArray), elementType);
  448. }
  449. /**
  450. * 将JSONArray转换为Bean的List,默认为ArrayList
  451. *
  452. * @param <T> Bean类型
  453. * @param jsonArray {@link JSONArray}
  454. * @param elementType List中元素类型
  455. * @return List
  456. * @since 4.0.7
  457. */
  458. public static <T> List<T> toList(JSONArray jsonArray, Class<T> elementType) {
  459. return null == jsonArray ? null : jsonArray.toList(elementType);
  460. }
  461. /**
  462. * 通过表达式获取JSON中嵌套的对象<br>
  463. * <ol>
  464. * <li>.表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值</li>
  465. * <li>[]表达式,可以获取集合等对象中对应index的值</li>
  466. * </ol>
  467. * <p>
  468. * 表达式栗子:
  469. *
  470. * <pre>
  471. * persion
  472. * persion.name
  473. * persons[3]
  474. * person.friends[5].name
  475. * </pre>
  476. *
  477. * @param json {@link JSON}
  478. * @param expression 表达式
  479. * @return 对象
  480. * @see JSON#getByPath(String)
  481. */
  482. public static Object getByPath(JSON json, String expression) {
  483. return getByPath(json, expression, null);
  484. }
  485. /**
  486. * 通过表达式获取JSON中嵌套的对象<br>
  487. * <ol>
  488. * <li>.表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值</li>
  489. * <li>[]表达式,可以获取集合等对象中对应index的值</li>
  490. * </ol>
  491. * <p>
  492. * 表达式栗子:
  493. *
  494. * <pre>
  495. * persion
  496. * persion.name
  497. * persons[3]
  498. * person.friends[5].name
  499. * </pre>
  500. *
  501. * @param <T> 值类型
  502. * @param json {@link JSON}
  503. * @param expression 表达式
  504. * @param defaultValue 默认值
  505. * @return 对象
  506. * @see JSON#getByPath(String)
  507. * @since 5.6.0
  508. */
  509. @SuppressWarnings("unchecked")
  510. public static <T> T getByPath(JSON json, String expression, T defaultValue) {
  511. if((null == json || StrUtil.isBlank(expression))){
  512. return defaultValue;
  513. }
  514. if(null != defaultValue){
  515. final Class<T> type = (Class<T>) defaultValue.getClass();
  516. return ObjectUtil.defaultIfNull(json.getByPath(expression, type), defaultValue);
  517. }
  518. return (T) json.getByPath(expression);
  519. }
  520. /**
  521. * 设置表达式指定位置(或filed对应)的值<br>
  522. * 若表达式指向一个JSONArray则设置其坐标对应位置的值,若指向JSONObject则put对应key的值<br>
  523. * 注意:如果为JSONArray,则设置值得下标不能大于已有JSONArray的长度<br>
  524. * <ol>
  525. * <li>.表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值</li>
  526. * <li>[]表达式,可以获取集合等对象中对应index的值</li>
  527. * </ol>
  528. * <p>
  529. * 表达式栗子:
  530. *
  531. * <pre>
  532. * persion
  533. * persion.name
  534. * persons[3]
  535. * person.friends[5].name
  536. * </pre>
  537. *
  538. * @param json JSON,可以为JSONObject或JSONArray
  539. * @param expression 表达式
  540. * @param value 值
  541. */
  542. public static void putByPath(JSON json, String expression, Object value) {
  543. json.putByPath(expression, value);
  544. }
  545. /**
  546. * 对所有双引号做转义处理(使用双反斜杠做转义)<br>
  547. * 为了能在HTML中较好的显示,会将&lt;/转义为&lt;\/<br>
  548. * JSON字符串中不能包含控制字符和未经转义的引号和反斜杠
  549. *
  550. * @param string 字符串
  551. * @return 适合在JSON中显示的字符串
  552. */
  553. public static String quote(String string) {
  554. return quote(string, true);
  555. }
  556. /**
  557. * 对所有双引号做转义处理(使用双反斜杠做转义)<br>
  558. * 为了能在HTML中较好的显示,会将&lt;/转义为&lt;\/<br>
  559. * JSON字符串中不能包含控制字符和未经转义的引号和反斜杠
  560. *
  561. * @param string 字符串
  562. * @param isWrap 是否使用双引号包装字符串
  563. * @return 适合在JSON中显示的字符串
  564. * @since 3.3.1
  565. */
  566. public static String quote(String string, boolean isWrap) {
  567. StringWriter sw = new StringWriter();
  568. try {
  569. return quote(string, sw, isWrap).toString();
  570. } catch (IOException ignored) {
  571. // will never happen - we are writing to a string writer
  572. return StrUtil.EMPTY;
  573. }
  574. }
  575. /**
  576. * 对所有双引号做转义处理(使用双反斜杠做转义)<br>
  577. * 为了能在HTML中较好的显示,会将&lt;/转义为&lt;\/<br>
  578. * JSON字符串中不能包含控制字符和未经转义的引号和反斜杠
  579. *
  580. * @param str 字符串
  581. * @param writer Writer
  582. * @return Writer
  583. * @throws IOException IO异常
  584. */
  585. public static Writer quote(String str, Writer writer) throws IOException {
  586. return quote(str, writer, true);
  587. }
  588. /**
  589. * 对所有双引号做转义处理(使用双反斜杠做转义)<br>
  590. * 为了能在HTML中较好的显示,会将&lt;/转义为&lt;\/<br>
  591. * JSON字符串中不能包含控制字符和未经转义的引号和反斜杠
  592. *
  593. * @param str 字符串
  594. * @param writer Writer
  595. * @param isWrap 是否使用双引号包装字符串
  596. * @return Writer
  597. * @throws IOException IO异常
  598. * @since 3.3.1
  599. */
  600. public static Writer quote(String str, Writer writer, boolean isWrap) throws IOException {
  601. if (StrUtil.isEmpty(str)) {
  602. if (isWrap) {
  603. writer.write("\"\"");
  604. }
  605. return writer;
  606. }
  607. char c; // 当前字符
  608. int len = str.length();
  609. if (isWrap) {
  610. writer.write('"');
  611. }
  612. for (int i = 0; i < len; i++) {
  613. c = str.charAt(i);
  614. switch (c) {
  615. case '\\':
  616. case '"':
  617. writer.write("\\");
  618. writer.write(c);
  619. break;
  620. default:
  621. writer.write(escape(c));
  622. }
  623. }
  624. if (isWrap) {
  625. writer.write('"');
  626. }
  627. return writer;
  628. }
  629. /**
  630. * 转义显示不可见字符
  631. *
  632. * @param str 字符串
  633. * @return 转义后的字符串
  634. */
  635. public static String escape(String str) {
  636. if (StrUtil.isEmpty(str)) {
  637. return str;
  638. }
  639. final int len = str.length();
  640. final StringBuilder builder = new StringBuilder(len);
  641. char c;
  642. for (int i = 0; i < len; i++) {
  643. c = str.charAt(i);
  644. builder.append(escape(c));
  645. }
  646. return builder.toString();
  647. }
  648. /**
  649. * 在需要的时候包装对象<br>
  650. * 包装包括:
  651. * <ul>
  652. * <li>{@code null} =》 {@code JSONNull.NULL}</li>
  653. * <li>array or collection =》 JSONArray</li>
  654. * <li>map =》 JSONObject</li>
  655. * <li>standard property (Double, String, et al) =》 原对象</li>
  656. * <li>来自于java包 =》 字符串</li>
  657. * <li>其它 =》 尝试包装为JSONObject,否则返回{@code null}</li>
  658. * </ul>
  659. *
  660. * @param object 被包装的对象
  661. * @param jsonConfig JSON选项
  662. * @return 包装后的值,null表示此值需被忽略
  663. */
  664. @SuppressWarnings({"rawtypes", "unchecked"})
  665. public static Object wrap(Object object, JSONConfig jsonConfig) {
  666. if (object == null) {
  667. return jsonConfig.isIgnoreNullValue() ? null : JSONNull.NULL;
  668. }
  669. if (object instanceof JSON //
  670. || JSONNull.NULL.equals(object) //
  671. || object instanceof JSONString //
  672. || object instanceof CharSequence //
  673. || object instanceof Number //
  674. || ObjectUtil.isBasicType(object) //
  675. ) {
  676. return object;
  677. }
  678. // 自定义序列化
  679. final JSONSerializer serializer = GlobalSerializeMapping.getSerializer(object.getClass());
  680. if (null != serializer) {
  681. final Type jsonType = TypeUtil.getTypeArgument(serializer.getClass());
  682. if (null != jsonType) {
  683. if (serializer instanceof JSONObjectSerializer) {
  684. serializer.serialize(new JSONObject(jsonConfig), object);
  685. } else if (serializer instanceof JSONArraySerializer) {
  686. serializer.serialize(new JSONArray(jsonConfig), object);
  687. }
  688. }
  689. }
  690. try {
  691. // fix issue#1399@Github
  692. if(object instanceof SQLException){
  693. return object.toString();
  694. }
  695. // JSONArray
  696. if (object instanceof Iterable || ArrayUtil.isArray(object)) {
  697. return new JSONArray(object, jsonConfig);
  698. }
  699. // JSONObject
  700. if (object instanceof Map) {
  701. return new JSONObject(object, jsonConfig);
  702. }
  703. // 日期类型原样保存,便于格式化
  704. if (object instanceof Date
  705. || object instanceof Calendar
  706. || object instanceof TemporalAccessor
  707. ) {
  708. return object;
  709. }
  710. // 枚举类保存其字符串形式(4.0.2新增)
  711. if (object instanceof Enum) {
  712. return object.toString();
  713. }
  714. // Java内部类不做转换
  715. if (ClassUtil.isJdkClass(object.getClass())) {
  716. return object.toString();
  717. }
  718. // 默认按照JSONObject对待
  719. return new JSONObject(object, jsonConfig);
  720. } catch (Exception exception) {
  721. return null;
  722. }
  723. }
  724. /**
  725. * 格式化JSON字符串,此方法并不严格检查JSON的格式正确与否
  726. *
  727. * @param jsonStr JSON字符串
  728. * @return 格式化后的字符串
  729. * @since 3.1.2
  730. */
  731. public static String formatJsonStr(String jsonStr) {
  732. return JSONStrFormatter.format(jsonStr);
  733. }
  734. /**
  735. * 是否为JSON字符串,首尾都为大括号或中括号判定为JSON字符串
  736. *
  737. * @param str 字符串
  738. * @return 是否为JSON字符串
  739. * @since 3.3.0
  740. */
  741. public static boolean isJson(String str) {
  742. return isJsonObj(str) || isJsonArray(str);
  743. }
  744. /**
  745. * 是否为JSONObject字符串,首尾都为大括号判定为JSONObject字符串
  746. *
  747. * @param str 字符串
  748. * @return 是否为JSON字符串
  749. * @since 3.3.0
  750. */
  751. public static boolean isJsonObj(String str) {
  752. if (StrUtil.isBlank(str)) {
  753. return false;
  754. }
  755. return StrUtil.isWrap(StrUtil.trim(str), '{', '}');
  756. }
  757. /**
  758. * 是否为JSONArray字符串,首尾都为中括号判定为JSONArray字符串
  759. *
  760. * @param str 字符串
  761. * @return 是否为JSON字符串
  762. * @since 3.3.0
  763. */
  764. public static boolean isJsonArray(String str) {
  765. if (StrUtil.isBlank(str)) {
  766. return false;
  767. }
  768. return StrUtil.isWrap(StrUtil.trim(str), '[', ']');
  769. }
  770. /**
  771. * 是否为null对象,null的情况包括:
  772. *
  773. * <pre>
  774. * 1. {@code null}
  775. * 2. {@link JSONNull}
  776. * </pre>
  777. *
  778. * @param obj 对象
  779. * @return 是否为null
  780. * @since 4.5.7
  781. */
  782. public static boolean isNull(Object obj) {
  783. return null == obj || obj instanceof JSONNull;
  784. }
  785. /**
  786. * XML转JSONObject<br>
  787. * 转换过程中一些信息可能会丢失,JSON中无法区分节点和属性,相同的节点将被处理为JSONArray。
  788. *
  789. * @param xml XML字符串
  790. * @return JSONObject
  791. * @since 4.0.8
  792. */
  793. public static JSONObject xmlToJson(String xml) {
  794. return XML.toJSONObject(xml);
  795. }
  796. /**
  797. * 加入自定义的序列化器
  798. *
  799. * @param type 对象类型
  800. * @param serializer 序列化器实现
  801. * @see GlobalSerializeMapping#put(Type, JSONArraySerializer)
  802. * @since 4.6.5
  803. */
  804. public static void putSerializer(Type type, JSONArraySerializer<?> serializer) {
  805. GlobalSerializeMapping.put(type, serializer);
  806. }
  807. /**
  808. * 加入自定义的序列化器
  809. *
  810. * @param type 对象类型
  811. * @param serializer 序列化器实现
  812. * @see GlobalSerializeMapping#put(Type, JSONObjectSerializer)
  813. * @since 4.6.5
  814. */
  815. public static void putSerializer(Type type, JSONObjectSerializer<?> serializer) {
  816. GlobalSerializeMapping.put(type, serializer);
  817. }
  818. /**
  819. * 加入自定义的反序列化器
  820. *
  821. * @param type 对象类型
  822. * @param deserializer 反序列化器实现
  823. * @see GlobalSerializeMapping#put(Type, JSONDeserializer)
  824. * @since 4.6.5
  825. */
  826. public static void putDeserializer(Type type, JSONDeserializer<?> deserializer) {
  827. GlobalSerializeMapping.put(type, deserializer);
  828. }
  829. // --------------------------------------------------------------------------------------------- Private method start
  830. /**
  831. * 转义不可见字符<br>
  832. * 见:https://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF
  833. *
  834. * @param c 字符
  835. * @return 转义后的字符串
  836. */
  837. private static String escape(char c) {
  838. switch (c) {
  839. case '\b':
  840. return "\\b";
  841. case '\t':
  842. return "\\t";
  843. case '\n':
  844. return "\\n";
  845. case '\f':
  846. return "\\f";
  847. case '\r':
  848. return "\\r";
  849. default:
  850. if (c < StrUtil.C_SPACE || //
  851. (c >= '\u0080' && c <= '\u00a0') || //
  852. (c >= '\u2000' && c <= '\u2010') || //
  853. (c >= '\u2028' && c <= '\u202F') || //
  854. (c >= '\u2066' && c <= '\u206F')//
  855. ) {
  856. return HexUtil.toUnicodeHex(c);
  857. } else {
  858. return Character.toString(c);
  859. }
  860. }
  861. }
  862. // --------------------------------------------------------------------------------------------- Private method end
  863. }

JSON字符串转换为JSON对象:

JSONObject jsonObject = JSONUtil.parseObj(str);

JSON对象转换为javabean对象:

responseData = JSONUtil.toBean(jsonObject, ResponseData.class);

------------

java数据类型间转换

在Java中,数据类型之间的转换通常有以下几种:

  1. 自动类型转换(隐式转换)

    • 基本数据类型之间的转换,如从byteshortintlongfloatdouble
    • charint
    • 从任何对象类型到Object类型。
  2. 强制类型转换(显式转换)

    • 当自动类型转换不适用或不足以满足需求时,可以使用强制类型转换。例如,从大范围的数值类型转换到小范围的数值类型,或者将对象类型转换为其他对象类型。
  3. 对象类型的转换

    • 当你期望一个对象具有特定类型时,可以使用强制类型转换。例如,将父类对象转换为子类对象。

下面是一些示例:

自动类型转换示例

 

java复制代码

byte b = 10;
short s = b; // 自动从byte到short的转换

强制类型转换示例

 

java复制代码

int a = 200;
byte b = (byte) a; // 强制从int到byte的转换,注意可能溢出或丢失数据

对象类型转换示例

 

java复制代码

Object obj = "Hello";
String str = (String) obj; // 将Object强制转换为String,注意这里可能出现ClassCastException异常

请注意,当进行强制类型转换时,要小心数据溢出或精度丢失。例如,将一个大范围的整数转换为小范围的整数可能会导致数据溢出。同样,将一个浮点数转换为整数会舍去小数部分。在进行数据类型转换时,始终要考虑数据的范围和精度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/915218
推荐阅读
相关标签
  

闽ICP备14008679号