मैं एक WCF सेवा से JSON कैसे साफ़ करूँ?


233

मैं कुछ JSON को WCF सेवा से वापस करने की कोशिश कर रहा हूं। यह सेवा केवल मेरे डेटाबेस से कुछ सामग्री लौटाती है। मुझे डेटा मिल सकता है। हालांकि, मैं अपने JSON के प्रारूप के बारे में चिंतित हूं। वर्तमान में, जो JSON लौटाता है वह इस तरह से स्वरूपित होता है:

{"d":"[{\"Age\":35,\"FirstName\":\"Peyton\",\"LastName\":\"Manning\"},{\"Age\":31,\"FirstName\":\"Drew\",\"LastName\":\"Brees\"},{\"Age\":29,\"FirstName\":\"Tony\",\"LastName\":\"Romo\"}]"} 

वास्तव में, मैं चाहूंगा कि मेरा JSON यथासंभव स्वच्छ रूप से स्वरूपित हो। मेरा मानना ​​है कि (मैं गलत हो सकता है), कि परिणाम का एक ही संग्रह, स्वच्छ JSON में प्रतिनिधित्व किया, ऐसा दिखना चाहिए:

[{
  "Age": 35,
  "FirstName": "Peyton",
  "LastName": "Manning"
}, {
  "Age": 31,
  "FirstName": "Drew",
  "LastName": "Brees"
}, {
  "Age": 29,
  "FirstName": "Tony",
  "LastName": "Romo"
}]

मुझे पता नहीं है कि "डी" कहां से आ रहा है। मुझे यह भी पता नहीं है कि बच के पात्रों को क्यों डाला जा रहा है। मेरी इकाई निम्नलिखित की तरह दिखती है:

[DataContract]
public class Person
{
    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }

    [DataMember]
    public int Age { get; set; }

    public Person(string firstName, string lastName, int age)
    {
        this.FirstName = firstName;
        this.LastName = lastName;
        this.Age = age;
    }
}

सेवा जो सामग्री लौटाने के लिए जिम्मेदार है, उसे इस प्रकार परिभाषित किया गया है:

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    public string GetResults()
    {
        List<Person> results = new List<Person>();
        results.Add(new Person("Peyton", "Manning", 35));
        results.Add(new Person("Drew", "Brees", 31));
        results.Add(new Person("Tony", "Romo", 29));

        // Serialize the results as JSON
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(results.GetType());
        MemoryStream memoryStream = new MemoryStream();
        serializer.WriteObject(memoryStream, results);

        // Return the results serialized as JSON
        string json = Encoding.Default.GetString(memoryStream.ToArray());
        return json;
    }
}

मैं WCF सेवा से "क्लीन" JSON कैसे लौटाऊं? धन्यवाद!


SOAP को XML लौटना चाहिए। JSON को वापस करने के लिए आप एक REST समापन बिंदु का उपयोग कर सकते हैं। एक नज़र stackoverflow.com/questions/186631/…
अकीरा यमामोटो

4
वैसे, अगर कोई और इस पार आता है और सोचता है कि "डी" संपत्ति क्यों है, तो यह एक जेएसएन भेद्यता को पैच करने के लिए है । इसे हटाने से आप फिर से कमजोर हो जाते हैं।
एलेक्स

4
@ एलेक्स - वह कमजोरता ऐरे ऑब्जेक्ट को पुनर्परिभाषित करने पर निर्भर करती है, जो अब आधुनिक ब्राउज़रों में संभव नहीं है। देखें stackoverflow.com/questions/16289894/...
Cheeso

अच्छी बात है। :) मेरा आधा जवाब अभी भी सच है - हालांकि यह उस भेद्यता को पैच करने के लिए था।
एलेक्स

जवाबों:


213

अपने GetResults की वापसी प्रकार बदलें List<Person>
उस कोड को हटा दें जिसे आप लिस्ट को एक जस स्ट्रिंग में क्रमबद्ध करने के लिए उपयोग करते हैं - WCF आपके लिए यह स्वचालित रूप से करता है।

व्यक्ति वर्ग के लिए आपकी परिभाषा का उपयोग करते हुए, यह कोड मेरे लिए काम करता है:

public List<Person> GetPlayers()
{
    List<Person> players = new List<Person>();
    players.Add(new  Person { FirstName="Peyton", LastName="Manning", Age=35 } );
    players.Add(new  Person { FirstName="Drew", LastName="Brees", Age=31 } );
    players.Add(new  Person { FirstName="Brett", LastName="Favre", Age=58 } );

    return players;
}

परिणाम:

[{"Age":35,"FirstName":"Peyton","LastName":"Manning"},  
 {"Age":31,"FirstName":"Drew","LastName":"Brees"},  
 {"Age":58,"FirstName":"Brett","LastName":"Favre"}]

(सभी एक लाइन पर)

मैंने इस विशेषता का उपयोग विधि पर भी किया है:

[WebInvoke(Method = "GET",
           RequestFormat = WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "players")]

WebInvoke with Method = "GET" वैबगेट के समान है, लेकिन चूंकि मेरे कुछ तरीके POST हैं, इसलिए मैं सभी WebInvoke का उपयोग स्थिरता के लिए करता हूं।

UriTemplate उस URL को सेट करता है जिस पर विधि उपलब्ध है। इसलिए मैं एक GET कर सकता हूं http://myserver/myvdir/JsonService.svc/playersऔर यह काम करता है।

URI में .svc से छुटकारा पाने के लिए IIRF या किसी अन्य URL राईटर को भी देखें।


चीज़ो - मैंने इस प्रश्न को पोस्ट करने से पहले इस दृष्टिकोण की कोशिश की। जब मैं इस दृष्टिकोण का उपयोग करता हूं, तो मुझे एक त्रुटि मिलती है जो कहती है कि "UriTemplate का उपयोग करने वाले समापन बिंदु 'का उपयोग' System.ServiceModel.Description.WebScriptEnabledBehavior 'के साथ नहीं किया जा सकता है।" मैं क्या गलत कर रहा हूं? धन्यवाद!
user208662

28
अपनी .config फ़ाइल में <webScriptEn enableBehavior /> के बजाय <webHttp /> का उपयोग करें।
Cheeso

9
ठीक है, मैंने <enableWebScript /> को <webHttp /> से बदल दिया और यह काम कर गया।
एमजी ओवेन

3
MGowen - FYI करें, एक नया प्रश्न पूछते समय सबसे अच्छा शर्त है ... एक पुराने प्रश्न के लिए एक टिप्पणी के रूप में प्रश्न पोस्ट करने के बजाय एक नया प्रश्न खोलें।
Cheeso

5
फेवर देखता है कि आपने वहां क्या किया।
रफिन

93

यदि आप अपने सर्विस क्लासेस में हार्डकॉपी विशेषताओं के बिना अच्छा जसन चाहते हैं,

<webHttp defaultOutgoingResponseFormat="Json"/>अपने व्यवहार विन्यास में उपयोग करें


28

यह आपके webservice के लिए web.config में पूरा किया गया है। बाइबहेवियर को <webHttp> पर सेट करें और आपको साफ JSON दिखाई देगा। अतिरिक्त "[d]" डिफ़ॉल्ट व्यवहार द्वारा सेट किया गया है जिसे आपको अधिलेखित करने की आवश्यकता है।

इस ब्लॉगपोस्ट के अलावा देखें: http://blog.clauskonrad.net/2010/11/how-to-expose-json-endpoint-from-wcf.html


8

मैंने उसी समस्या का सामना किया, और "WebMessageBodyStyle.Bit" के लिए बॉडीसिटल एट्रिब्यूट वैल्यू को बदलकर इसे हल किया:

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json, UriTemplate = "GetProjectWithGeocodings/{projectId}")]
GeoCod_Project GetProjectWithGeocodings(string projectId);

लौटी हुई वस्तु अब लपेटी नहीं जाएगी।


1

जब आप जीईटी विधि का उपयोग कर रहे हैं तो अनुबंध यह होना चाहिए।

[WebGet(UriTemplate = "/", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
List<User> Get();

इसके साथ हमारे पास बूट पैरामीटर के बिना एक json है

Aldo Flores @alduar http://alduar.blogspot.com


1

अपने IServece.cs में निम्न टैग जोड़ें: BodyStyle = WebMessageBodyStyle.Bare

 [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "Getperson/{id}")]

    List<personClass> Getperson(string id);

क्या आप यह भी बता सकते हैं कि BodyStyle परिणाम को क्यों प्रभावित कर सकता है?
एमबीएच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.