7

連想配列をjsonwcfサービスに渡したいのですが。

したがって、JavaScriptでは、これに似たものがあります。

var map = { };
map['a'] = 1;
map['b'] = 2;
map['c'] = 3;

そして、私のwcfサービスでは、辞書を期待したいと思います。

[OperationContract][WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public void setDictionary(Dictionary<string, int> myDictionary);

ただし、「マップ」は実際にはプロパティを割り当てている単なるオブジェクトであるため、マップをシリアル化するのではなく、[オブジェクトオブジェクト]として送信します。

WCFサービスによってDictionaryオブジェクトとして逆シリアル化するために正しくシリアル化する方法を知っている人はいますか?

4

2 に答える 2

5

デフォルトでは、WCFはDictionaryJSONオブジェクトとして表されません。代わりに、キーと値のペアの配列として表されます。したがって、そのマップをWCFサービスに送信するには、マップを適切に変換する必要があります(以下のコードを参照)。

もう1つの方法は、JSONオブジェクトに基づいて辞書にデータを入力する方法を知っているカスタムメッセージフォーマッターを使用することです。メッセージフォーマッタの詳細については、このブログ投稿を確認してください。

これは、そのオブジェクトをサービスに渡す1つの方法を示しています。

Service.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="StackOverflow_15001755.Service"
                CodeBehind="StackOverflow_15001755.svc.cs" 
                Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Service.svc.cs:

using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace StackOverflow_15001755
{
    [ServiceContract]
    public class Service
    {
        static Dictionary<string, int> dictionary;

        [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public void setDictionary(Dictionary<string, int> myDictionary)
        {
            dictionary = myDictionary;
        }

        [WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public Dictionary<string, int> getDictionary()
        {
            return dictionary;
        }
    }
}

Test.html(HTML / JSコード、ajax呼び出しにjQueryを使用):

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript" src="scripts/jquery-1.7.2.js"></script>
    <script type="text/javascript" src="scripts/json2.js"></script>
</head>
<body>
    <script type="text/javascript">
        function StackOverflow_15001755_Test() {
            function dictionaryToKVPArray(obj) {
                var data = [];
                for (var key in obj) {
                    data.push({ Key: key, Value: obj[key] });
                }

                return data;
            }

            function KVPArrayToDictionary(arr) {
                var result = {};
                arr.forEach(function (item) {
                    result[item.Key] = item.Value;
                });

                return result;
            }

            var map = {};
            map['a'] = 1;
            map['b'] = 2;
            map['c'] = 3;
            var data = dictionaryToKVPArray(map);

            var baseUrl = "/StackOverflow_15001755.svc";
            $.ajax({
                type: 'POST',
                url: baseUrl + '/setDictionary',
                contentType: 'application/json',
                data: JSON.stringify({ myDictionary: data }),
                success: function (result) {
                    $('#result').text('Sent the dictionary');
                    $.ajax({
                        type: 'GET',
                        url: baseUrl + '/getDictionary',
                        success: function (result) {
                            var newMap = KVPArrayToDictionary(result);
                            $('#result2').text(JSON.stringify(newMap));
                        }
                    });
                }
            });
        }
    </script>
    <input type="button" value="StackOverflow 15001755" onclick="StackOverflow_15001755_Test();" /><br />
    <div id='result'></div><br />
    <div id='result2'></div><br />
</body>
</html>
于 2013-02-22T01:00:35.587 に答える
4

JSON.stringify(map)マップのシリアル化されたバージョンを取得するためにを使用して、これを機能させることができました。次に、それをディクショナリではなく文字列としてWCFサービスに渡し、Json.Netフレームワークを使用するメソッドで自分で逆シリアル化します。

シリアル化されたマップ:

{'a':'0','b':'1','c':'2'}

WCFサービス:

[OperationContract][WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public void doDictionaryStuff(string serializedMap);

Json.Netフレームワークを使用してWCFサービスで逆シリアル化します。

public void doDictionaryStuff(string serializedMap)
{
    Dictionary<string, int> map = JsonConvert.DeserializeObject<Dictionary<string,int>>(serializedMap);
    //do stuff with the dictionary.
}

理想的ではありませんが、機能します。

于 2013-02-22T08:36:17.143 に答える