SMART LLC

JSON形式のデータをPOST送受信する方法(.NET)

公開日:2015/08/08

Web APIにPOSTするのにデータをJSON形式で渡す必要があった。
VB.NETでJSON形式のデータをPOSTする方法をメモする。

データコントラクト

JSONデータをシリアル化および逆シリアル化するとかデータコントラクトの使用を参考に。
JSON形式のデータを生成するのにDataContractJsonSerializerクラスを使うんだけど
そのためにはデータコントラクト(データの定義)なるものを用意する必要があるそう。
DataContractAttribute属性を適用したクラスにDataMemberAttribute属性を適用したメンバーを入れたのがデータコントラクト。

データコントラクト、こんな感じ。

<DataContract> Private Class RequestJson
	<DataMember> Public Property test1 As String
	<DataMember> Public Property test2 As Integer
End Class

使い方は普通のクラスと同じ。

JSONデータの生成

データコントラクト生成して中身を入れたらシリアライザーでメモリストリームにJSONデータを書き込む。

Dim reqJson As New RequestJson
reqJson.test1 = "aaa"
reqJson.test2 = 123
Dim serializer As New DataContractJsonSerializer(GetType(RequestJson))
Using writeStream As New MemoryStream
    serializer.WriteObject(writeStream, reqJson)
End Using

JSONデータを文字列で取り出して表示してみる。

Console.WriteLine(Encoding.UTF8.GetString(writeStream.ToArray()))

できてる。

{"test1":"aaa","test2":123}

数値だとダブルコーテーションつかない。キーの大文字小文字はデータコントラクトのメンバー名が反映される。

POST送信

POSTする時はStringContentに格納してHttpClient.PostAsync。

Dim reqJson As New RequestJson
reqJson.Test1 = "aaa"
reqJson.Test2 = 123
Dim serializer As New DataContractJsonSerializer(GetType(RequestJson))
Using writeStream As New MemoryStream
    serializer.WriteObject(writeStream, reqJson)
    Using data As New StringContent(Encoding.UTF8.GetString(writeStream.ToArray()), Encoding.UTF8, "application/json"), _
    hc As New HttpClient, _
    postTask As Task(Of HttpResponseMessage) = hc.PostAsync("https://posttestserver.com/post.php", data)
        postTask.Wait()
    End Using
End Using

今回も登場、Henry's HTTP Post Dumping Server。ありがたや。

JSONデータを受け取る場合

サーバの戻り値がJSONデータの場合もデータコントラクトを用意しておいてシリアライザーで読み込む。

Using res As HttpResponseMessage = postTask.Result, _
readTask As Task(Of String) = res.Content.ReadAsStringAsync
	readTask.Wait()
	Using readStream As New MemoryStream(Encoding.UTF8.GetBytes(readTask.Result()))
		Dim reader As New DataContractJsonSerializer(GetType(ResponseJson))
		Dim json As ResponseJson = CType(reader.ReadObject(readStream), ResponseJson)
	End Using
End Using

この1ヶ月間でつくったプログラムの中にメモしておきたいことがかなり貯まってる。
少しずつ書き出してこう_(:3 」∠)_

SHARE