如何将json对象作为args中的参数之一传递给chaincode

时间:2018-10-01 06:49:22

标签: hyperledger-fabric hyperledger

在超级账本结构中调用时,如何将json对象作为args中的参数之一传递给chaincode。 我已经尝试过了,结果是stub.getArgs()方法是[Object,Object]

4 个答案:

答案 0 :(得分:1)

从NodeSDK调用chaincode方法时,使用以下命令将json对象作为json字符串传递 JSON.stringify方法。

当您在链码中收到一个json字符串作为参数时,请在golang对象中对其进行反序列化(以下为示例代码)

function, args := helper.Stub.GetFunctionAndParameters()

var jsonObj interface{}

err := json.Unmarshal([]byte(args[0]), &jsonObj)
if err != nil {
   fmt.Println("Can't deserialize", []byte(args[0]))
} 

注意:上面的代码将反序列化匿名json字符串。如果您已经知道json结构,请先使用golang struct创建相同的json结构,然后将json字符串反序列化为该结构的对象。

答案 1 :(得分:0)

应作为字符串传递(例如,包含json数据的字符串)。从那里,您可以使用JSON.parse(string)转换为json。

答案 2 :(得分:0)

如果您使用任何第三方Rest API调用/查询分类帐,则可以将对象转换为base64编码的字符串并以链码对其进行解码。

答案 3 :(得分:0)

1)检查发送的JSON是否有效。

2)您必须将json对象转换为转义 json对象以作为参数传递。

online tool将有助于将json对象转换为转义/未转义的json。

未转义的JSON:

create table restriction_codes (ingredient_number, restriction_code) as
    select '001', 'NN'   from dual union all
    select '001', 'R-03' from dual union all
    select '001', 'R-02' from dual union all
    select '002', 'R-22' from dual union all
    select '002', 'NN'   from dual union all
    select '003', 'R-03' from dual union all
    select '004', 'CCC'  from dual union all
    select '004', 'DDD'  from dual
;

create table locations (restriction_code, location) as
    select 'NN'  , 'CLE' from dual union all
    select 'NN'  , 'LAX' from dual union all
    select 'NN'  , 'ORD' from dual union all
    select 'NN'  , 'JFK' from dual union all
    select 'NN'  , 'PIT' from dual union all
    select 'NN'  , 'DFW' from dual union all
    select 'R-03', 'CLE' from dual union all
    select 'R-03', 'LAX' from dual union all
    select 'R-02', 'LAX' from dual union all
    select 'R-02', 'DFW' from dual union all
    select 'R-22', 'JFK' from dual union all
    select 'R-03', 'PIT' from dual union all
    select 'CCC' , 'ORD' from dual union all
    select 'DDD' , 'LGA' from dual
;

转义的JSON:

with
  prep (ingredient_number, restriction_code, restriction_count) as (
    select ingredient_number, restriction_code, 
           count(*) over (partition by ingredient_number)
    from   restriction_codes
  )
select p.ingredient_number, l.location
from   prep p inner join locations l on p.restriction_code = l.restriction_code
group  by p.ingredient_number, p.restriction_count, l.location
having count(*) = p.restriction_count
order  by p.ingredient_number, l.location
;

INGREDIENT_NUMBER  LOCATION
------------------ --------
001                LAX     
002                JFK     
003                CLE     
003                LAX     
003                PIT 

与JSON.stringify(object)相同