2011-09-05 29 views
12

Chỉ cần tải về ServiceStack.Text để sử dụng nó trong ASP.NET của tôi. Tôi có lớp với nhiều thuộc tính và muốn tuần tự hóa năm trong số chúng (chuỗi, số nguyên, nhị phân) thành JSON. Bất cứ ai có thể gửi ví dụ đơn giản làm thế nào để tạo đối tượng JSon từ lớp của tôi?ServiceStack.Text cách serialize class thành JSon

+0

nhập để lưu ý rằng mặc dù bạn cần 'sử dụng ServiceStack; 'nhập khẩu của bạn,' phương pháp ToJson' đòi hỏi không chỉ một ref để ServiceStack nhưng cũng đòi hỏi một tham chiếu đến ServiceStack.Text trong dự án của bạn. – ruffin

Trả lời

17

ServiceStack sẽ deserialize tất cả các thuộc tính công khai của POCO theo mặc định.

Nếu bạn chỉ muốn tuần tự hóa một vài thuộc tính thì bạn muốn trang trí lớp của mình với thuộc tính [DataContract], [DataMember] (giống như cách bạn sử dụng MS DataContractJsonSerializer), ví dụ:

[DataContract] 
public class MyClass 
{ 
    public string WillNotSerializeString { get; set; } 

    [DataMember] 
    public string WillSerializeString { get; set; } 

    [DataMember] 
    public int WillSerializeInt { get; set; } 

    [DataMember] 
    public byte[] WillSerializeByteArray { get; set; } 
} 

Sau đó, bạn có thể sử dụng một trong hai phương pháp tĩnh tiện ích trên JsonSerializer đến (De) serialize nó, hoặc các phương pháp khuyến nông ngắn gọn hơn, ví dụ:

var dto = new MyClass { WillSerializeString = "some text" }; 
string json = dto.ToJson(); 
MyClass fromJson = json.FromJson<MyClass>(); 

Edit:

Vì @Noah đề cập (từ nhận xét), bạn cũng có thể sử dụng thuộc tính [IgnoreDataMember] để loại trừ một thuộc tính duy nhất.

+1

Tương tự, nếu bạn muốn tất cả các thuộc tính của bạn được tuần tự hóa _except_, bạn có thể trang trí bất động sản đó với '[IgnoreDataMember]', NHƯNG bạn KHÔNG nên trang trí lớp với '[DataContract]' trong trường hợp đó, hoặc nó sẽ không hoạt động như kỳ vọng. Tôi chỉ làm điều này với ServiceStack trên một dự án, và rất vui khi thấy nó hoạt động. –

+0

Và lưu ý: serialize/deserialize tất cả công khai> thuộc tính <, không bao gồm> trường <. –

+0

@Quandary Right, bạn cần đặt 'JsConfig.IncludePublicFields = true;' để tuần tự hóa các trường công khai, xem: http://stackoverflow.com/a/15372520/85785 – mythz

6

Bạn có thể sử dụng thuộc tính [Serializable()] trên lớp tùy chỉnh của bạn và sau đó:

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

var Json = serializer.Serialize(myObject); 

Để bỏ qua thuộc tính cụ thể trong đối tượng bạn đang serializing, chỉ cần đặt [NonSerialized] attribure trên chúng.

Cập nhật:

Cho rằng bạn muốn sử dụng ServiceStack làm serialization của bạn, trang web ServiceStack đưa ra ví dụ sau đây:

var customer = new Customer { Name="Joe Bloggs", Age=31 }; 
var json = JsonSerializer.SerializeToString(customer); 
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

Nguồn: http://www.servicestack.net/mythz_blog/?p=344

+2

Tôi không muốn sử dụng Microsoft serializer vì nó rất chậm. Tôi hỏi về ServiceStack.Text – Tomas

+1

Nếu bạn đặc biệt quan tâm đến ServiceStack.Text thì điều gì khiến bạn không thể tải xuống dự án mẫu của họ và chỉ cần có một cái nhìn? –

+0

Trang web ServiceStack thậm chí còn cho bạn biết cách sử dụng nó: http://www.servicestack.net/mythz_blog/?p=344 –

1

kiểm tra của servicestack chứng minh rằng bằng cách cung cấp thuộc tính [DataContract][DataMember] cho phép bạn xác định thuộc tính nào đang được sắp xếp và không.

Test: https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/DataContractTests.cs

đối tượng trong thử nghiệm: https://github.com/ServiceStack/ServiceStack.Text/blob/master/tests/ServiceStack.Text.Tests/Support/DdnDtos.cs

Các vấn đề liên quan