2012-07-18 13 views
21

के दौरान $ id को कैसे निकालें I NewtonSoft.JSON का उपयोग कर रहा हूं ... JsonConvert.SerializeObject (myObject) के बाद। यह $ आईडी जोड़कर है ... JSON serialization

तरह

"$ id": "1", "BookingId": 0, "CompanyId": 0, "IsCashBooking": झूठे, "PAYMENTMETHOD ": 0, " IsReferral ": झूठे, " IsReferralPercent ": झूठे, " ReferralPaymentType ": 0, " ReferralDues ": 0, " PassengerId ": 0, " DepartmentID ": 0, " CostCenterID " : 0, "डेडमिल्स": 0

,210

हम JsonSerializerSettings द्वारा या किसी अन्य विधि द्वारा इस $ आईडी को दूर करता है, तो हाँ तो कैसे ...

उत्तर

40

मैं अपने WebApiConfig रजिस्टर विधि के लिए इस कोड को जोड़ा और मैं JSON में सभी $ आईडी से छुटकारा मिला।

var json = config.Formatters.JsonFormatter; 
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 
+4

वैध उत्तर अगर आपको रिकर्सिव सीरियलाइजेशन (पदानुक्रम को क्रमबद्ध करने) की आवश्यकता नहीं है। $ आईडी का उपयोग हैंडल को संरक्षित करने के लिए किया जाता है, इसलिए यदि तत्व कहीं भी दोहराता है तो यह डेटा दोहराएगा, यह सिर्फ मूल की $ आईडी पर डुप्लिकेट की $ ref संपत्ति को सेट करेगा। उस स्थिति में इस संपत्ति को Newtonsoft.Json.PreserveReferencesHandling.Objects और साजिद के उत्तर पर सेट किया जाना चाहिए। – parliament

+0

धन्यवाद आप महान हैं :) – semirturgay

+0

आप मेरा दिन बचाएं – Polymorphism

3

मामले 'आईडी' में अपने वर्ग की संपत्ति है तो [JsonIgnore] विशेषता उस पर आवेदन कर सकते हैं। अन्यथा शायद यहाँ अपने प्रश्न के लिए जवाब है:

http://james.newtonking.com/json/help/index.html?topic=html/PreserveObjectReferences.htm

+1

* * * आईडी आईडी फ़ील्ड के रूप में ऑब्जेक्ट * के * id' प्रॉपर्टी वैल्यू * का उपयोग करने के लिए * न्यूटन सॉफ़्ट * के लिए * या * बस संदर्भ कोडिंग के लिए 'id' प्रॉपर्टी का उपयोग करें? यह सबसे तार्किक उपयोग की तरह प्रतीत होता है, क्योंकि सीरियलाइज़र को उत्पन्न करने के लिए धारावाहिक होने वाली ग्राफ ऑब्जेक्ट्स की कुल संख्या के आधार पर इसे अलग-अलग आईडी में परिणाम मिलता है। (यह एक समस्या है यदि आप व्यक्तिगत रूप से एक धारावाहिक वस्तुएं जिन्हें बाद में एक ऑब्जेक्ट में इकट्ठा करने की आवश्यकता होती है और deserialized) – JoeBrockhaus

+1

@ जो ब्रोकहॉस जानकारी यहां प्राप्त करने पर जानकारी: http://stackoverflow.com/questions/9237939/how-to-use -कस्टम-संदर्भ-समाधान-साथ-जेसन-नेट – arichards

6

आप एक कस्टम ContractResolver का उपयोग कर रहे किसी कारण से है, तो यह अन्य ढेर अतिप्रवाह पर एक नज़र डालें;

Json.Net adding $id to EF objects despite setting PreserveReferencesHandling to "None"

+0

यह मेरे लिए एकमात्र सही जवाब है। इसने दो स्थितियों में समस्या हल की: एक SQL सर्वर प्रदाता के साथ ही ओरेकल ओडीपी प्रदाता का उपयोग कर। – Howie

2

अपने वेब एपीआई के लिए JSON में $ आईडी निकालने के लिए। मैंने अपनी कक्षा वस्तुओं और [जेसनप्रोपर्टी (IsReference = false)] के लिए [JsonObject (IsReference = false)] शामिल किया है जो मेरे गुणों के लिए ऑब्जेक्ट प्रकार हैं। मेरे मामले में RespObj प्रॉपर्टी जेनेरिक टाइप टी है और संग्रहित समेत किसी ऑब्जेक्ट प्रकार को पास कर सकता है, इसलिए मुझे धारावाहिक JSON स्ट्रिंग में $ आईडी से छुटकारा पाने के लिए [JsonProperty (IsReference = false)] का उपयोग करना पड़ा।

मैं अपने WebApiConfig परिवर्तन नहीं किया क्योंकि मैं वेब एपीआई के लिए MVC सहायता पृष्ठ उपयोग कर रहा था और यह मुझे मेरे webApiconfig में इस विन्यास के लिए आवश्यक:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
     json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All; 
     json.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize; 

वर्ग वस्तु

[DataContract(IsReference = true)] 
[JsonObject(IsReference = false)] 
public class QMResponse<T> where T : new() 
{ 
    public QMResponse() 
    { 

    } 

    /// <summary> 
    /// The response code 
    /// </summary> 
    public string RespCode { get; set; } 

    /// <summary> 
    /// The response message 
    /// </summary> 
    public string RespMxg { get; set; } 

    /// <summary> 
    /// The exception message 
    /// </summary> 
    public string exception { get; set; } 

    /// <summary> 
    /// The object type returned 
    /// </summary>   
    [JsonProperty(IsReference = false)] 
    public T RespObj { get; set; } 

    /// <summary> 
    /// No of records returned 
    /// </summary> 
    public long RecordCount { get; set; } 

    /// <summary> 
    /// The Session Object 
    /// </summary> 
    public string session_id { get; set; } 

} 
1

कस्टम ContractResolver सेटिंग PreserveReferences हैंडलिंग सेटिंग ओवरराइड करता है।

डिफॉल्ट कंट्रैक्ट रेसोलवर/आईकॉन्ट्रैक्ट रेसोलवर के कार्यान्वयन में, इसे जोड़ें;

public override JsonContract ResolveContract(Type type) { 
    var contract = base.ResolveContract(type); 
    contract.IsReference = false; 
    return contract; 
} 

यह PreserveReferencesHandling के समान व्यवहार करता है।एक कस्टम ContractResolver

0

बिना कोई भी सेटिंग आप बुनियादी विन्यास रख सकते हैं:

Newtonsoft.Json.PreserveReferencesHandling.All; 

मैं अपने तरीकों

public JsonResult<T> Get() 
{ 
    return Json(result); 
} 

यह मेरे लिए ठीक काम करता है के लिए इस कोड को प्रारूप का प्रयोग किया।