2013-09-26 2 views
5

У меня есть набор сложных бизнес-объектов, которые я хотел бы сериализовать для Json для использования в веб-службе. В настоящее время я использую DataContractJsonSerializer для работы с Json, но он отказывается от десериализации, потому что XmlReader по умолчанию не может обрабатывать строки Base64.Сериализация JSON.NET, если переопределить ToString

После прочтения много положительных отзывов от Json.Net, я решил попробовать. Удивительно, но самый простой случай создает ошибочный вывод, если бизнес-объект переопределяет метод ToString(). Вместо генерации JSON он просто испускает строковое значение.

Например, следующий оператор создает только строку, поскольку, как видно из сериализатора, объект рассматривается как простая строка.

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

Вместо форматированного вывода json все, что я получаю, это строка заголовка. Должен ли я отмечать объект каким-то особым способом, чтобы избежать этого? Поскольку иерархия бизнес-объектов включает в себя множество объектов, которые переопределяют ToString(), я бы предпочел не вводить специальные атрибуты и т. Д.

+1

Ваш код работает отлично, только одна вещь называется 'ToJson' в методе ToString. –

ответ

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 
    { 
    } 
} 
Смежные вопросы