質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

Q&A

解決済

2回答

5003閲覧

WCFを利用したRestFullのjsonデータ逆シリアライズに関して

ShintaroIshida

総合スコア87

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

0グッド

1クリップ

投稿2015/04/15 04:52

編集2015/04/15 06:31

WCFを利用したRestサービスの構築を行っております。
送信側は、外部サービス。受信側が本サービスです。

受信データの逆シリアライズは、DataContractで定義して行っています。
通常の配列形式や、一次元の連想配列、多次元の配列(連想配列->配列)は、
問題なく取得出来ているのですが多次元の連想配列が取得出来ずに困っています。

lang

1// 送信されたJSON 2// {"data":{"AHAHA":"AHAHAHHHA","BHAHAHAHA":"HAHAHGUDGAIU","KEKEKK":"HSHADHGUA"}} 3 4// サービスの定義 5[ServiceContract] 6public interface IGreetService 7{ 8 // POST 9 [OperationContract] 10 [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "datapost")] 11 GreetResponse datapost(GreetRequest req); 12} 13 14// データコントラクト定義 15[DataContract] 16public class GreetRequest { 17 [DataMember(Name="data")] 18 public Dictionary<string,string> data{ get; set; } 19} 20 21// 処理クラス 22 public GreetResponse datapost(GreetRequest r_data) 23 { 24 Console.Write(r_data.data); // ここのデータがCount=0で返ってくる 25 return new GreetResponse 26 { 27 Message = "Test" 28 }; 29

細かな点は省いていますが、主要なソースは上記になります。
一次元の連想配列が取れるもしくは、多次元の配列は取得出来ているので
要素内の型指定に問題があるのではないか?と推測しているのですが、
どうすればいいのか見当もつきません。

参考URLの提示でも結構です。情報を頂ければと思います。
宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

誤作動で投稿してしまいました

投稿2015/04/16 05:43

編集2015/04/16 05:46
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

WCF自体は専門外ですので、わかる範囲で回答します。
WCF ということはバックグラウンドで動いているのは DataContractJsonSerializer だと思います。

DataContractJsonSerializer はそのままだと思ったようにDictionary型のシリアライズ、デシリアライズを実行してくれません。(※一度単体で使用されてみるといいと思います)

DataContractJsonSerializer 自体が対応していないというわけではありません。
DataContractJsonSerializerSettings を使用すればシリアライズ、デシリアライズは可能になります。
ただ、デフォルトの挙動ではサンプルに挙げられているようなJSONをデシリアライズすることができないのです。

どこかで設定可能なのか、それが私にはわかりません… この情報が役に立てば幸いです。

lang

1var settings = new DataContractJsonSerializerSettings(); 2settings.UseSimpleDictionaryFormat = true; // このオプションを設定すると読み込み可能に 3 4var serializer = new DataContractJsonSerializer(typeof(GreetRequest), settings); 5using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 6{ 7 var request = (GreetRequest)serializer.ReadObject(stream); 8}

投稿2015/04/15 12:08

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShintaroIshida

2015/04/16 01:22

回答ありがとうございます。 >DataContractJsonSerializer 確かに上記でデシリアライズされている認識です。 >DataContractJsonSerializer はそのままだと思ったようにDictionary型の >シリアライズ、デシリアライズを実行してくれません。 >(※一度単体で使用されてみるといいと思います) >DataContractJsonSerializer 自体が対応していないというわけではありません。 >DataContractJsonSerializerSettings を使用すればシリアライズ、 >デシリアライズは可能になります。 ここがはっきりしただけでもかなりありがたいです。 更にsettingの手法まで。 どこで設定するのか?確かにそれが問題で、サービスを実装していく過程で、その辺が扱える部分が見当たらないのが現状です。 頂いた情報を元に角度を変えて調べてみます
haru666

2015/04/16 05:54

独自にシリアライズした情報をMessage型でWCF経由で送信する方法がありました。 (※英語です) http://stackoverflow.com/questions/3118504/how-to-set-json-net-as-the-default-serializer-for-wcf-rest-service/3131413#3131413 こちらを参考に、Messageを生で受け取ることはできないでしょうか 回答前に少し探してみたのですが、シリアライザの変更方法や、直近の回避策としてWCFのメッセージを解析してシリアライザに直接渡す方法を調べたのですが、参考サイトを見つけられませんでした。 後者はプロジェクトが大きくなるにつれ大変になるため抜本的な解決にはなりませんが… 宜しくお願いします。
ShintaroIshida

2015/04/16 11:04

>こちらを参考に、Messageを生で受け取ることはできないでしょうか 方法としては、同じ事を考えたのですが現状その方法は出来ませんでした。 (実現方法がよくわかりませんでした) 新規サービスでしたので、頂いた情報を元に考えうる限る色々と試してみましたが、 自分で決めていた期限を超えてしまったので、実装ベースをASP.Net のWEBサービスベースに変えて実装しました。 そのベースで、実装するとDataContractでもDictionary型が取り扱えたので、 この手法でいこうと思います。 ※ OnDeserializeing 等を利用して上手く挟み込めないかとか色々やったんですが。。。 約5年ぶりぐらいにC# & .Netを扱ったので、本当にいい勉強になっています。 haru666様から頂いた情報も本当に有難かったです。
haru666

2015/04/17 02:46

いえ、私自身は中途半端な情報を提供しただけですので… 解決できたのであればよかったです。 ASP.NETベースだと変換はJson.NETになったんでしょうか… Json.NETならシンプルなDictionaryの形式に対応していますね。 今後上手く開発が進むことをお祈りしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問