2013-09-26 13 views
5

Bir web hizmetinde kullanmak üzere Json'a serileştirmek istediğim bir dizi karmaşık iş nesnesine sahibim. Şu anda Json'u üretmek için DataContractJsonSerializer kullanıyorum, ancak varsayılan XmlReader, Base64 dizelerini işleyemediği için seri hale getirme üzerinde balks.JS5.NET serileştirme geçersiz kılınırsa ToString

'u okuduktan sonra Json.Net ile ilgili olumlu yorumlar, denemeye karar verdim. Şaşırtıcı bir şekilde, en basit durum, iş nesnesi ToString() yöntemini geçersiz kılarsa hatalı çıktı üretir. JSON oluşturmak yerine, sadece dize değerini yayar. Örneğin, aşağıdaki ifade, yalnızca bir dizgi üretir; çünkü seri hale getirici, nesneyi basit bir dize olarak görüntülediğinde görünür.

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

Json biçimlendirilmiş çıktı yerine, tek alacağım başlık dizesidir. Bunu önlemek için nesneyi özel bir şekilde işaretlemem gerekir mi? İş nesnesi hiyerarşisi, ToString() işlevini geçersiz kılan birçok nesne içerdiğinden, özel öznitelikleri vb. Tanıtmaktan kaçınmayı tercih ederim.

+1

Kodunuz ince, çalışır "ToString" yönteminde bir şey "ToJson". –

cevap

1

Bunu yanlış test ediyor olabilirsiniz. Sadece LINQPad aşağıdaki kodu koştum:

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

Çıktı:

{"Title":"hi"} 
1

bu tahmin gerçek sınıf kendisine bağlı bir TypeConverterAttribute sahip olması mümkün mü? Sadece aynı soruna rastladım ve TypeConverterAttribute'un buna neden olduğunu öğrendim. Thast durumunda, this yardımcı olabilir (en azından benim için yaptı).

istemeden bir derleyici uyarı almadan (a PropertyGrid içinde nesneyi görüntülemek için belki basit bir TypeConverter ekleyerek) programı kırabilir, çünkü bu çok kötü ...

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 
    { 
    } 
} 
İlgili konular