在区块链后端题目中WeBASEUtils包基本上绕不开的话题其中返回值解析一直是一个很让人头疼的事情面对从合约上传来的数据的处理我进行了相关整理一般考试时会遇到诸如图示中的JSON解析问题下面以一个简单的_注册/登录_案例来进行简单讲解一、合约返回单个数据【状态判断】1打开VM虚拟机、搭链、进入“节点控制台”界面选择“合约管理/合约IDE”新建AccountTest.sqlpragma solidity ^0.4.24; contract AccountTest { uint8 userIndex; mapping(address uint8) userMapping; constructor() public { userIndex 0; } //用户注册 function register(address user) public returns(uint8) { if (userMapping[user] 0) { return userMapping[user]; } userIndex; userMapping[user] userIndex; return userIndex; } //用户登录 function login(address user) public view returns(uint8) { return userMapping[user]; } }这个合约的作用是创建一个mapping这个mapping可以看作一个“双向键值对”使用。- 在这个“键值对”mapping中可以通过user作为键查询其对应的userIndex索引也可以将userIndex作为键查询user值。- register【注册方法】将从后端传入的注册地址user与方法内自增的索引值userIndex建立“双向键值对”mapping并返回 索引值userIndex。- login 【登录方法】输入地址通过mapping获取索引值并将索引值返回给后端。2保存、编译、部署、合约调用:注册任意一个“测试用户”使用。点击确认会返回一个“ 交易回执 ”上方背景里弹框显示“ 交易成功 ”注 点击output中data元素下的方格可以直接复制具体内容如下{ transactionHash: 0x0a0155ccc84b4397f8fd1f4eed956f41408a5b7a485670fdbb2b309d7df0907b transactionIndex: 0x0 root: 0x0000000000000000000000000000000000000000000000000000000000000000 blockNumber: 9 blockHash: 0xdbbcd5e55e00675c56c93875393c917c130e0732e0f1b467647282106170248c from: 0xe67baff4c8cb7950212fbfc778255f8bd445225b to: 0x3b3893e2402a9aa029cfad1d670f5ce3ede15189 gasUsed: 23678 contractAddress: 0x0000000000000000000000000000000000000000 logs: [] logsBloom: 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 status: 0x0 statusMsg: None input: 0x4420e486000000000000000000000000e67baff4c8cb7950212fbfc778255f8bd445225b output: 0x0000000000000000000000000000000000000000000000000000000000000002 txProof: null receiptProof: null message: Success statusOK: true }3其中我们需要着重注意的有以下几个内容- blockNumber(区块数量-块高)【原生SDK方法】- blockHash(区块哈希)【原生SDK方法】- status(区块链底层交易执行状态码)-- 0x0 交易执行成功-- 0x1 执行失败-- 0x1a 调用地址错误- output()-- 返回十六进制数据-- 若返回的数据为十进制数字则直接截掉前两位0x,并将16进制转为10进制数据-- HexUtil 是Hutool工具包的“ 十六进制处理工具类 ”Dict _result weBASEUtuils.funcPost(xxx,xxx,xxx); // 获取“ 交易回执 ”--- obj JSONObject obj JSONUtil.parseobj(_result.get(result)); // 提取output String output obj.get(output); // 若output数据为十进制数据 long resInt HexUtil.hexToLong(output.substring(2)); /* long型数据表示十进制数字 hex型数据 表示十六进制数字 hexToLong表示将十六进制转入十进制数据 */- message-- 交易成功Sucess-- 交易失败Error:xxxxxx... ...若存在data.equals(Success)则使用get(message)- statusOK【广泛使用来交易状态判断】-- false-- true例如开头的问题一般最后返回成功值为success(ok)时都使用statusOK二、合于返回 数组/结构体/多个数据【获取链上数据】JSONObject obj JSONUtil,parseObj(_result.get(result));String output obj.get(output).toString();JSONArray array JSONUtil.prarseArray(poutput);// 在数组中取值String value0 dataArray.get(0).toString();String value1 dataAray.get(1).toString();注本内容不适用于实际项目开发仅作个别区块链技术比赛案例使用