আমি কীভাবে ডাব্লুসিএফ পরিষেবা থেকে পরিষ্কার জেএসএন ফিরিয়ে দেব?


233

আমি ডাব্লুসিএফ পরিষেবা থেকে কিছু জেএসএন ফেরত দেওয়ার চেষ্টা করছি। এই পরিষেবাটি কেবল আমার ডাটাবেস থেকে কিছু সামগ্রী ফিরে আসে। আমি তথ্য পেতে পারি। তবে আমি আমার জেএসওনের ফর্ম্যাটটি নিয়ে উদ্বিগ্ন। বর্তমানে, ফিরে আসা জেএসএন এর মতো ফর্ম্যাট করা হয়েছে:

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

বাস্তবে, আমি চাই আমার 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;
    }
}

ডাব্লুসিএফ পরিষেবা থেকে কীভাবে আমি "ক্লিন" জেএসএন ফিরিয়ে দেব? ধন্যবাদ!


SOAP এক্সএমএল ফেরত আসা উচিত। আপনি JSON ফিরে আসতে একটি REST শেষ পয়েন্ট ব্যবহার করতে পারেন। দেখে নিন স্ট্যাকওভারফ্লো.com
আকিরা ইয়ামামোটো

4
যাইহোক, অন্য কেউ যদি এদিকে আসে এবং "ডি" সম্পত্তিটি কেন আছে তা অবাক করে, এটি একটি JSON দুর্বলতার প্যাচ করার জন্য । এটিকে সরিয়ে ফেলা আপনাকে আবারও দুর্বল করে তোলে।
অ্যালেক্স

4
@ অ্যালেক্স - যে দুর্বলতা অ্যারে অবজেক্টের নতুন সংজ্ঞা দেওয়ার উপর নির্ভর করে, যা আধুনিক ব্রাউজারগুলিতে আর সম্ভব নয় possible দেখুন stackoverflow.com/questions/16289894/...
Cheeso

এটা ভালো. :) আমার অর্ধেক উত্তর যদিও এখনও সত্য - এটি দুর্বলতার প্যাচ করার পক্ষে ছিল।
অ্যালেক্স

উত্তর:


213

আপনার getResults এর রিটার্নের ধরণটি পরিবর্তন করুন List<Person>
আপনি কোনও জসন স্ট্রিংয়ে তালিকাটি ক্রমিকায়িত করতে যে কোডটি ব্যবহার করেন তা সরিয়ে ফেলুন - ডাব্লুসিএফ স্বয়ংক্রিয়ভাবে আপনার জন্য এটি করে।

ব্যক্তি শ্রেণীর জন্য আপনার সংজ্ঞা ব্যবহার করে, এই কোডটি আমার পক্ষে কাজ করে:

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")]

মেথডের সাথে ওয়েবআইভোভ = "জিইটি" ওয়েবগেটের সমান, তবে যেহেতু আমার কয়েকটি পদ্ধতি পোষ্ট, তাই আমি সমস্ত ওয়েবআইভোকে ধারাবাহিকতার জন্য ব্যবহার করি।

UriTemplate ইউআরএল সেট করে যেখানে পদ্ধতিটি উপলভ্য। সুতরাং আমি একটি জিইটি করতে পারি http://myserver/myvdir/JsonService.svc/playersএবং এটি ঠিক কাজ করে।

ইউআরআই-তে .svc থেকে মুক্তি পেতে আইআইআরএফ বা অন্য কোনও ইউআরএল লেখকও দেখুন।


চিজো - আমি এই প্রশ্নটি পোস্ট করার আগে এই পদ্ধতির চেষ্টা করেছি। আমি যখন এই পদ্ধতির ব্যবহার করি, তখন আমি একটি ত্রুটি পেয়েছি যা বলে যে "'সিস্টেম.সোসওয়ারমোডেল.ডেসক্রিপশন.সেইনস্ক্রিপ্টএনব্লিংবিহার' এর সাথে 'ইউরিপ্যাম্পলেট' ব্যবহার করে শেষ পয়েন্টগুলি ব্যবহার করা যাবে না।" আমি কি ভুল করছি? ধন্যবাদ!
ব্যবহারকারী 208662

28
আপনার .config ফাইলে <webScriptEnablingBehavior /> এর পরিবর্তে <webHttp /> ব্যবহার করুন।
চিজো

9
ঠিক আছে, আমি <ওয়েবউইচটিএসপি /> এর সাথে <সক্ষম ওয়েবস্ক্রিপ্ট /> প্রতিস্থাপন করেছি এবং এটি কাজ করেছে।
এমজিওউইন

3
এমজিউন - এফওয়াইআই, একটি নতুন প্রশ্ন জিজ্ঞাসা করার সময় সবচেয়ে ভাল বাজি হ'ল ... কোনও পুরানো উত্তরের মন্তব্য হিসাবে প্রশ্ন পোস্ট করার চেয়ে নতুন প্রশ্ন খুলতে হবে।
চিজো

5
ফাভের দেখেছে আপনি সেখানে কী করেছেন।
রাফিন

93

আপনি যদি নিজের সার্ভিস ক্লাসে হার্ডকোডিং বৈশিষ্ট্য ছাড়াই চমৎকার জসন চান,

ব্যবহার <webHttp defaultOutgoingResponseFormat="Json"/>আপনার আচরণ কনফিগ মধ্যে


28

এটি আপনার ওয়েব সার্ভিসের জন্য ওয়েবকনফিগে সম্পন্ন হয়েছে। <webHttp> এ বাইন্ডিংবিহারটি সেট করুন এবং আপনি পরিষ্কার JSON দেখতে পাবেন। অতিরিক্ত "[d]" ডিফল্ট আচরণ দ্বারা সেট করা হয় যা আপনাকে ওভাররাইট করতে হবে।

এছাড়াও এই ব্লগপোস্টটি দেখুন: http://blog.clauskonrad.net/2010/11/how-to-expose-json-endPoint-from-wcf.html


8

আমি একই সমস্যার মুখোমুখি হয়েছি এবং বডিস্টাইল গুণাবলীর মান "ওয়েবম্যাসেজবডিস্টাইল.বেয়ার" এ পরিবর্তন করে সমাধান করেছি:

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

ফিরে আসা বস্তু আর মোড়ানো হবে না pped


1

আপনি যখন জিইটি পদ্ধতি ব্যবহার করছেন তখন চুক্তিটি অবশ্যই এটি হতে হবে।

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

এটির সাথে বুট প্যারামিটার ছাড়াই আমাদের একটি জসন রয়েছে

অ্যাল্ডো ফ্লোরস @ আলডুয়ার http://alduar.blogspot.com


1

আপনার IServece.cs এ নিম্নলিখিত ট্যাগ যুক্ত করুন: বডিস্টাইল = ওয়েবমেজেজবডিস্টাইল.বিয়ার

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

    List<personClass> Getperson(string id);

আপনি কী ব্যাখ্যা করতে পারেন যে বডিস্টাইল ফলাফলকে প্রভাবিত করতে পারে কেন?
এমবিএইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.