2013-09-26 170 views
5

Tôi có một tập các đối tượng nghiệp vụ phức tạp mà tôi muốn tuần tự hóa thành Json để sử dụng trong một dịch vụ web. Tôi hiện đang sử dụng DataContractJsonSerializer để sản phẩm Json, nhưng nó balks trên deserialization bởi vì XmlReader mặc định không thể xử lý Base64 chuỗi.serialization JSON.NET nếu ghi đè ToString

Sau khi đọc nhiều bài đánh giá tích cực của Json.Net, tôi đã quyết định thử. Đáng ngạc nhiên, trường hợp đơn giản nhất tạo ra đầu ra sai nếu đối tượng nghiệp vụ ghi đè phương thức ToString(). Thay vì tạo JSON, nó đơn giản phát ra giá trị chuỗi.

Ví dụ: câu lệnh sau chỉ tạo chuỗi, khi trình nối tiếp xuất hiện để xem đối tượng dưới dạng chuỗi đơn giản.

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

Thay vì đầu ra định dạng json, tất cả những gì tôi nhận được là chuỗi tiêu đề. Tôi có phải đánh dấu đối tượng theo một cách đặc biệt nào đó để tránh điều này không? Vì phân cấp đối tượng nghiệp vụ bao gồm nhiều đối tượng ghi đè ToString(), tôi thà tránh phải giới thiệu các thuộc tính đặc biệt, v.v.

+1

Mã của bạn hoạt động tốt, chỉ một thứ gọi 'ToJson' trong phương thức' ToString'. –

Trả lời

1

Bạn có thể thử nghiệm sai. Tôi chỉ cần chạy đoạn mã sau vào 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); 
    } 
} 

Output:

{"Title":"hi"} 
1

Có thể rằng lớp học thực tế của bạn có một TypeConverterAttribute gắn liền với nó? Tôi chỉ chạy vào cùng một vấn đề chính xác và phát hiện ra rằng TypeConverterAttribute đã gây ra điều này. Trong trường hợp thast, this có thể giúp (ít nhất nó đã làm cho tôi).

này là rất xấu bởi vì bạn vô tình có thể phá vỡ chương trình của bạn (bằng cách đơn giản thêm một TypeConverter có thể cho hiển thị các đối tượng trong một PropertyGrid) mà không nhận được một cảnh báo trình biên dịch ...

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 
    { 
    } 
}