【问题标题】:JSON RPC Application: Adding Byte Array to JTokenJSON RPC 应用程序:向 JToken 添加字节数组
【发布时间】:2017-10-18 20:07:20
【问题描述】:

在发布此问题之前,我花了几个小时在论坛上搜索此问题的答案,所以如果有人问过这个问题,请见谅。

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

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

    **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 请求发送“字节”作为字节数组 [187,0](即字节(0)= 187,字节(1)= 0)。但是,Jtoken 会立即通过 base 64 编码将字节数组转换为字符串。

使用 TextVisualizer,我看到 rpcObject =

{ “Id”:“倒数”, “Jsonrpc”:“2.0”, “方法”:“dali.send”, “参数”:{ “universe_id”:4, “字节”:“uwA=”, “expect_answer”:是的, “发送两次”:假 } }

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

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

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

【问题讨论】:

    标签: java json vb.net json.net


    【解决方案1】:

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

    Dim rpcObject As New JObject() From { _
        {"Id", generateRandomString()}, _
        {"Jsonrpc", "2.0"}, _
        {"method", "dali.send"}, _
        {"params", New JObject() From { _
            {"universe_id", universe_id}, _
                {"bytes", JToken.FromObject(Array.AsReadOnly(bytes))}, _
            {"expect_answer", expect_answer}, _
            {"send_twice", send_twice} _
        }} _
    }
    

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

    示例fiddle

    【讨论】:

    • 太棒了!我会试试看。
    • 最终的工作是将字节数组更改为列表(即字节为 List(Of [Byte])
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    相关资源
    最近更新 更多