2017-05-18 9 views
2

フォーラムを検索して、この質問への回答を投稿する前に数時間を費やしましたので、質問のどこかで質問してください。JSON RPCアプリケーション:JTokenにバイト配列を追加

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()** 

私はバイト配列[187,0]として "バイト" を送信しています(すなわちバイト(0)= 187、バイト(1)= 0)私のRPC要求のため。ただし、Jtokenは、バイト配列をベース64エンコーディングを介してすぐに文字列に変換します。 "penultes"、 "JSONRPC": "2.0"、 "方法": "dali.send"、 「paramsは私はrpcObjectが=

{ "ID" を参照TextVisualizerを使用

、 「:{ "universe_id偽 ":4、 "バイト": "UWA ="、 "expect_answer":真、 "send_twice"} Json.Net直列化における定義により }

ガイド、プリミティブ型Byte []はString(base 64 encoded)に変換します。本質的に、次の.NET変換はConvert.ToBase64String(bytes)という文字列 "uwA ="を生成しています。

私はそれで生きることができます。ただし、これをシリアル化する前に文字列に変更する必要があります。私は上記のオブジェクト(rpcObject)をシリアル化する前にどのように変更することができますか?私がする必要があるのは、文字列パラメータ "bytes"の値 "uwA ="をConvert.FromBase64String()を使って "[187,0]"に変換することです。

シリアル化する前に、そのパラメータだけを簡単に分離する方法はありませんでした。

答えて

0

Json.NETは、の配列を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} _ 
    }} _ 
} 

ここで私は必要な中間JArrayに読み取り専用のコレクションラッパーをシリアライズするJToken.FromObject()を使用しています。他の同等の同等のバイトコレクションをシリアル化することもできます。 bytes.ToList()。しかし、Array.AsReadOnly<T>()は、読み取り専用のコレクションラッパーを返します。したがって、大きな入力バイト配列に対しては最小限のメモリを消費する必要があります。

サンプルfiddle

+0

素晴らしい!私はそれを試してみましょう。 –

+0

@MichaelFreeman - それは機能しましたか? – dbc

+0

何がうまくいったのは、バイト配列をリスト(バイト(List [Of [Byte]) –

関連する問題