智能合約從入門到精通:Lib工具庫(二)
LibJson
LibJson主要封裝了對JSON格式的字符串一些操作;
支持直接調用、using for ; 調用
註意:正如在Lib工具庫說明中提到的,LibJson 庫的使用稍微有點特殊:
不管是直接調用,還是using for *;方式調用,在合約方法中,如果要使用一次、或者多次LibJson庫中的方法,則在第一次使用LibJsos庫方法前,需要對被操作的json字符串進行如下操作:
//字符串入棧 LibJson.push(_json);
在最後一個LibJsos庫方法之後,要進行如下操作
//出棧
LibJson.pop();
示例:
pragma solidity ^0.4.2; import "./utillib/LibJson.sol"; contract TestManager { using LibJson for *; string[] public _arr; function test() constant returns(bool _ret) { string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}"; // step01: 字符串入棧 LibJson.push(_json); // step02: 操作字符串,判斷自否為一個合法的json格式 bool isJson = _json.isJson(); //或者直接調用 //bool isJson = LibJson.isJson(_json); _json.jsonRead("nodeId"); // "JZNCGP" // step03: 出棧 LibJson.pop(); } }
- LibJson.push() 與 LibJson.pop() 一定是成對出現的;
- 當對字符串的操作結束後務必調用pop將棧中的元素移除掉;
JSON格式判斷
描述:判斷指定串是否為標準的JSON格式
結構定義function isJson(string _json) internal constant returns(bool _ret);
示例
string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}"; bool _ret= _json.isJson(); // _ret = true
讀取JSON中key的值
描述:指定key讀取JSON串中的值
結構定義function jsonRead(string _json, string _keyPath) internal constant returns(string _ret);
示例
string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}"; string memory _ret= _json.jsonRead("nodeId"); // _ret = "JZNCGP"
判斷JSON的key是否存在
描述:判斷JSON中的key是否存在
結構定義function jsonKeyExists(string _json, string _keyPath) internal constant returns(bool _ret)
示例
string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}"; bool _ret= _json.jsonKeyExists("nodeId"); // _ret = true
uint[]數組轉JSON字符串
描述:將一個uint[]數組轉為json格式字符串
結構定義function toJsonArray(uint[] storage _self) internal constant returns(string _json); Copy
示例
pragma solidity ^0.4.2;
import "LibJson.sol";
contract TestManager {
using LibJson for *;
uint[] public _arr;
function test() constant returns(string _ret) {
_arr.push(1);
_arr.push(2);
_ret = _arr.toJsonArray(); // _ret = [1,2]
}
}
string[]數組轉JSON字符串
描述:將一個uint[]數組轉為json格式字符串
結構定義
function toJsonArray(string[] storage _self) internal constant returns(string _json);
示例
pragma solidity ^0.4.2;
import "LibJson.sol";
contract TestManager {
using LibJson for *;
string[] public _arr;
function test() constant returns(string _ret) {
_arr.push("1");
_arr.push("2");
_ret = _arr.toJsonArray(); // _ret = ["1","2"]
}
}
字符串×××數組轉uint[]
描述:將一個字符串的×××數組轉為uint[],如:"[1,3,4]"
結構定義
function fromJsonArray(uint[] storage _self, string _json) internal returns(bool succ);
示例
pragma solidity ^0.4.2;
import "LibJson.sol";
contract TestManager {
using LibJson for *;
uint[] public _arr;
function test() constant returns(string _ret) {
string memory _json = "[1,2,3]";
_arr.fromJsonArray(_json); // _arr = [1,2,3],_arr.length = 3
}
}
字符串數組轉string[]
描述:將一個字符串的×××數組轉為string[],如:["1","3","4"]
結構定義
function fromJsonArray(uint[] storage _self, string _json) internal returns(bool succ);
示例
pragma solidity ^0.4.2;
import "LibJson.sol";
contract TestManager {
using LibJson for *;
string[] public _arr;
function test() constant returns(string _ret) {
string memory _json = "[\"1\",\"2\",\"3\"]";
_arr.fromJsonArray(_json); // _arr = ["1","2","3"],_arr.length = 3
}
}
元素入棧
描述:當需要對JSON進行操作,如:isJson()、jsonRead()操作時需要先進行push()操作,與此同時當使用後一定使用pop()進行棧數據的移除;
結構定義
function push(string _json) internal constant returns(uint _len) ;
Copy
示例
pragma solidity ^0.4.2;
import "LibJson.sol";
contract TestManager {
using LibJson for *;
string[] public _arr;
function test() constant returns(string _ret) {
string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
LibJson.push(_json);
_json.isJson();
_json.jsonRead("type"); // return 1
LibJson.pop();
}
}
元素出棧
描述:當需要對JSON進行操作,如:isJson()、jsonRead()操作時需要先進行push()操作,與此同時當使用後一定使用pop()進行棧數據的移除;
結構定義
function pop() internal constant;
示例
pragma solidity ^0.4.2;
import "LibJson.sol";
contract TestManager {
using LibJson for *;
function test() constant returns(string _ret) {
string memory _json = "{\"errno\":27,\"hash\":\"0xf16a2a734ccf0456807e166ad310ec7767f71e8d4003154b73596741683c6433\",\"nodeId\":\"JZNCGP\",\"type\":1}";
LibJson.push(_json);
_json.isJson();
_json.jsonRead("type"); // return 1
LibJson.pop();
}
}
LibStack
LibStack封裝了對棧的使用,合約中通過棧進行字符串拼接操作。
僅支持直接調用
pragma solidity ^0.4.2;
import "./utillib/LibStack.sol";
contract TestManager {
function test() constant returns(string _ret) {
len = LibStack.push("{");
len = LibStack.appendKeyValue("userAddr", "1");
len = LibStack.appendKeyValue("name", "2");
len = LibStack.append("}");
_ret = LibStack.popex(len);
// _ret = {"userAddr":"1","name":"2"}
}
}
說明:
- 棧的使用開始前必須進行LlibStack.push();操作,如果沒有固定元素可push一個空串;
- 每次入棧數據後會返回當前占中元素長度;
- 出棧時指定要出棧的長度,即可獲得棧中的字符串信息
入棧
描述:對一個棧使用前必須要做的事,push()調用就新開了一個棧空間使用,如果沒有固定元素可以push一個空字符串:LibStack.push("");
結構定義function push(string _data) internal constant returns(uint _len);
示例
uint len = LibStack.push(""); // 返回當前棧中元素個數
出棧
描述:當需要獲取棧中元素時調用popex()獲取棧中數據.
結構定義function popex() internal constant returns(string _ret);
示例
uint len = LibStack.push(""); // 返回當前棧中元素個數 len = LibStack,append("aaa"); // append 追加單個元素 string memory _ret = LibStack.popex(len); // _ret = "aaa"
向棧追加單個元素
描述:當棧開辟空間後向棧中追加單個元素
結構定義function append(string _data) internal constant returns(uint _len);
示例
uint len = LibStack.push(""); // 返回當前棧中元素個數 len = LibStack,append("aaa"); // append 追加單個元素 string memory _ret = LibStack.popex(len); // _ret = "aaa"
向棧追加k-v鍵值對
描述:當棧開辟空間後向棧中追加k-v鍵值對
結構定義function appendKeyValue(string _key, string _val) internal constant returns (uint _len) ; function appendKeyValue(string _key, uint _val) internal constant returns (uint _len) ; function appendKeyValue(string _key, int _val) internal constant returns (uint _len) ; function appendKeyValue(string _key, address _val) internal constant returns (uint _len);
示例
uint len = LibStack.push("{"); // 返回當前棧中元素個數 len = LibStack,appendKeyValue("name","Tom"); len = LibStack,appendKeyValue("age",1); len = LibStack,appendKeyValue("creator",0x8affd1952705d8a908e016695c6e454ad39a1c6f); len = LibStack,append("}"); string memory _ret = LibStack.popex(len); // _ret = {"name":"Tom","age":1,"creator":"0x8affd1952705d8a908e016695c6e454ad39a1c6f"}
LibLog
LibLog主要封裝了日誌打印操作,在合約中的輸出日誌體現在日誌文件中進行輸出
僅支持直接調用
日誌輸出(多元素)
描述:輸入一個字符串進行日誌輸出
結構定義function log(string _str) internal constant returns(uint _ret); function log(string _str, string _str2, string _str3) internal constant returns(uint _ret); function log(string _str, string _str2) internal constant returns(uint _ret);
示例
LibLog.log("hello world"); LibLog.log("hello world","01"); LibLog.log("hello world","01","02");
日誌輸出(不同類型)
描述:不同類型輸入日誌輸出
結構定義// 字符串 + 無符號××× function log(string _str, uint _ui) internal constant returns(uint _ret); // 字符串 + 有符號××× function log(string _str, int _i) internal constant returns(uint _ret); // 字符串 + 地址 function log(string _str, address _addr) internal constant returns(uint _ret);
示例
LibLog.log("hello world",111); LibLog.log("hello world",131); LibLog.log("hello world",0x8affd1952705d8a908e016695c6e454ad39a1c6f);
參考內容:https://open.juzix.net/doc
智能合約開發教程視頻:區塊鏈系列視頻課程之智能合約簡介
智能合約從入門到精通:Lib工具庫(二)