2013-02-21 13 views
7

पर जावास्क्रिप्ट मानचित्र पास करें मैं एक एसोसिएटिव सरणी को जेएसएस डब्ल्यूसीएफ सेवा में पास करना चाहता हूं।जेसन डब्ल्यूसीएफ सेवा

तो जावास्क्रिप्ट में मैं इस के लिए कुछ समान है:

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); 

लेकिन यह एक [वस्तु वस्तु के रूप में नक्शे भेजता है ] इसे क्रमबद्ध करने के बजाय क्योंकि 'नक्शा' वास्तव में केवल एक वस्तु है जिसे मैं गुणों को आवंटित कर रहा हूं।

क्या कोई जानता है कि मैं इसे डब्ल्यूसीएफ सेवा द्वारा डिक्शनरी ऑब्जेक्ट के रूप में deserialized करने के लिए सही ढंग से कैसे क्रमबद्ध कर सकता हूं?

+1

क्या आपने [JSON.stringify] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/JSON/stringify) फ़ंक्शन का प्रयास किया है? 'JSON.stringify (मानचित्र) echo; 'एक स्ट्रिंग आउटपुट करना चाहिए:' {"ए": 1, "बी": 2, "सी": 3} ' – Imperative

+0

यह करता है लेकिन डब्ल्यूसीएफ फेंकता है: फॉर्मेटर ने अपवाद फेंक दिया संदेश को deserialize करने की कोशिश कर रहे हैं – LoghamLogan

उत्तर

5

डिफ़ॉल्ट रूप से, डब्ल्यूसीएफ JSON ऑब्जेक्ट्स के रूप में Dictionary का प्रतिनिधित्व नहीं करता है - यह उन्हें कुंजी/मूल्य जोड़े के सरणी के रूप में दर्शाता है। तो डब्ल्यूसीएफ सेवा में उस मानचित्र को भेजने के लिए, आपको इसे उचित रूप से गुप्त करना होगा (नीचे कोड देखें)।

एक और विकल्प कस्टम संदेश फ़ॉर्मेटर का उपयोग करना है, जो जानता है कि JSON ऑब्जेक्ट्स के आधार पर शब्दकोशों को कैसे पॉप्युलेट करना है। संदेश स्वरूपकों के बारे में अधिक जानकारी के लिए, यह blog post देखें।

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 (एचटीएमएल/

यह आपकी सेवा के लिए उस वस्तु गुजर से एक रास्ता दिखाता है जेएस कोड, 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> 
+0

आपका शब्दकोश ToKVPArray() विधि बस मुझे इसके लिए जरूरी है!धन्यवाद =) उत्तर के रूप में चिह्नित किया गया क्योंकि यह दिखाता है कि डिक्शनरी ऑब्जेक्ट को deserialize करने के साथ-साथ इसे वापस जावास्क्रिप्ट में वापस लाने के लिए डब्ल्यूसीएफ सेवा में सही डेटा को कैसे पास किया जाए! – LoghamLogan

4

मैप के क्रमबद्ध संस्करण प्राप्त करने के लिए JSON.stringify(map) का उपयोग करके यह काम करने में कामयाब रहा। फिर इसे डिक्शनरी की बजाय स्ट्रिंग के रूप में डब्ल्यूसीएफ सेवा में पास करना और Json.Net framework का उपयोग करके इसे विधि में deserializing।

धारावाहिक नक्शा:

{'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 framework का उपयोग कर WCF सेवा के लिए इसका deserializing:

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

यह आदर्श नहीं है, लेकिन काम करता है।

संबंधित मुद्दे