JSON RPC应用程序:将字节数组添加到JToken

时间:2017-05-18 20:43:08

标签: java json vb.net json.net

在发布此问题之前,我已经花了几个小时在论坛上搜索这个问题的答案,所以如果问题被提出,请原谅我。

我需要通过Jason RPC发送一个2字节的参数,但是我遇到了一些困难。

我正在使用VB.NET(VS 2013)作为我的开发平台。我创建了一个发送函数,这是我的问题的根源。这是一个片段:

    **Public Function daliSend(url As String, universe_id As Integer, bytes As Byte(), expect_answer As Boolean, send_twice As Boolean) As Result
        Dim rpcObject As New JObject() From { _
            {"Id", generateRandomString()}, _
            {"Jsonrpc", "2.0"}, _
            {"method", "dali.send"}, _
            {"params", New JObject() From { _
                {"universe_id", universe_id}, _
                {"bytes", bytes}, _
                {"expect_answer", expect_answer}, _
                {"send_twice", send_twice} _
            }} _
        }
      Dim json As String = JsonConvert.SerializeObject(rpcObject ).ToLower()**

我正在为我的RPC请求发送“bytes”作为字节数组[187,0](即bytes(0)= 187,bytes(1)= 0)。但是,Jtoken立即通过base 64编码将字节数组转换为字符串。

使用TextVisualizer,我看到rpcObject =

{   “Id”:“penultes”,   “Jsonrpc”:“2.0”,   “方法”:“dali.send”,   “params”:{     “universe_id”:4,     “bytes”:“uwA =”,     “expect_answer”:是的,     “send_twice”:false   } }

根据Json.Net序列化指南中的定义,Primitive Type Byte []转换为String(base 64编码)。实质上,以下.NET转换正在发生Convert.ToBase64String(bytes),它产生字符串“uwA =”。

我可以忍受。但是,这需要在序列化之前更改为字符串。关于如何在序列化之前修改上述对象(rpcObject)的任何想法?我需要做的是将字符串参数“bytes”值“uwA =”转换回“[187,0]”,可能使用Convert.FromBase64String(),因此数组是序列化的,而不是字符串。

在序列化之前,我还没有找到一种简单的方法来隔离该参数。

1 个答案:

答案 0 :(得分:0)

Json.NET只会将字节数组序列化为Base64。其他非数组字节集合将被序列化为整数数组,例如Array.AsReadOnly<T>()返回的集合:

bytes.ToList()

这里我使用JToken.FromObject()将只读集合包装器序列化为所需的中间JArray。您还可以序列化任何其他类似的等效字节集合,例如Array.AsReadOnly<T>()。但是{{1}}返回一个只读集合 wrapper ,因此对于大型输入字节数组应该占用最少的内存。

示例fiddle