2013-09-26 9 views
5

ओवरराइड करता है तो मेरे पास जटिल व्यावसायिक ऑब्जेक्ट्स का एक सेट है जिसे मैं वेब सेवा में उपयोग के लिए जेसन को क्रमबद्ध करना चाहता हूं। मैं वर्तमान में जेसन के उत्पाद के लिए DataContractJsonSerializer का उपयोग कर रहा हूं, लेकिन यह deserialization पर balks क्योंकि डिफ़ॉल्ट XmlReader बेस 64 तारों को संभाल नहीं सकता है।JSON.NET serialization यदि ToString

पढ़ने के बाद कई जेसननेट की सकारात्मक समीक्षा, मैंने इसे एक कोशिश देने का फैसला किया। हैरानी की बात है कि यदि सबसे आसान मामला ToString() विधि को ओवरराइड करता है तो सबसे आसान मामला ग़लत आउटपुट उत्पन्न करता है। JSON उत्पन्न करने के बजाय, यह केवल स्ट्रिंग मान को उत्सर्जित करता है।

उदाहरण के लिए, निम्न कथन केवल एक स्ट्रिंग उत्पन्न करता है, क्योंकि धारावाहिक वस्तु को एक साधारण स्ट्रिंग के रूप में देखने के लिए प्रतीत होता है।

public class MyClass { 
    public string Title{get;set;} 
    public override ToString(){ return Title; } 
    public string ToJson(){ 
     return JsonConvert.SerializeObject(this); 
    } 
} 

जेसन स्वरूपित आउटपुट के बजाय, मुझे शीर्षक स्ट्रिंग मिलती है। क्या मुझे इससे बचने के लिए ऑब्जेक्ट को किसी विशेष तरीके से चिह्नित करना है? चूंकि व्यापार ऑब्जेक्ट पदानुक्रम में कई ऑब्जेक्ट्स शामिल हैं जो ToString() को ओवरराइड करते हैं, मैं विशेष विशेषताओं, आदि को पेश करने से बचाना चाहूंगा।

+1

आपका कोड काम करता है ठीक है, केवल 'ToString' विधि में एक चीज़ 'ToJson' को कॉल करें। –

उत्तर

1

आप इस गलत परीक्षण कर रहे हैं। मैं सिर्फ LINQPad में निम्न कोड भाग गया:

void Main() 
{ 
    new MyClass{Title = "hi"}.ToJson().Dump(); 
} 

// Define other methods and classes here 
public class MyClass { 
    public string Title{get;set;} 
    public override string ToString(){ return Title; } 
    public string ToJson(){ 
     return JsonConvert.SerializeObject(this); 
    } 
} 

आउटपुट:

{"Title":"hi"} 
1

क्या यह संभव है अपने वास्तविक वर्ग एक TypeConverterAttribute इसे करने के लिए दी जाती है? मैं बस एक ही समस्या में भाग गया और पाया कि TypeConverterAttribute इसका कारण बन रहा था। थैस्ट मामले में, this मदद कर सकता है (कम से कम यह मेरे लिए किया गया)।

यह बहुत बुरा है, क्योंकि आप अनजाने में अपने कार्यक्रम (बस एक TypeConverter जोड़कर शायद एक PropertyGrid में वस्तु प्रदर्शित करने के लिए) एक संकलक चेतावनी प्राप्त किए बिना तोड़ सकते हैं ...

using Newtonsoft.Json; 
using System; 
using System.ComponentModel; 

namespace ConsoleApplication5 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var with = new WithTypeConverter() { Bla = 12, Blub = "With" }; 
      var without = new WithoutTypeConverter() { Bla = 12, Blub = "Without" }; 

      Console.WriteLine(with); 
      Console.WriteLine(JsonConvert.SerializeObject(with)); 

      Console.WriteLine(without); 
      Console.WriteLine(JsonConvert.SerializeObject(without)); 
      Console.ReadKey(); 
     } 
    } 

    public class baseClass 
    { 
     public int Bla { get; set; } 
     public string Blub { get; set; } 

     public override string ToString() 
     { 
      return String.Format("{0}: {1}", this.GetType().Name, Blub); 
     } 
    } 

    [TypeConverter(typeof(ExpandableObjectConverter))] 
    public class WithTypeConverter : baseClass 
    { 
    } 

    public class WithoutTypeConverter : baseClass 
    { 
    } 
}