2016-02-24 13 views
5

Tôi đang sử dụng JSON.net Newton.NET để sắp xếp/deserialize nội dung cho tôi. Nhưng tôi có danh sách này trong đó chúng có Object loại:JSON.NET - Làm cách nào để bao gồm Xử lý tên loại cho các kiểu C# nguyên thủy được lưu trữ trong một mảng/danh sách dưới dạng Kiểu đối tượng

var list = new List<Object>() 
{ 
    "hi there", 
    1, 
    2.33 
}; 

Khi tôi serialize rằng với TypeNameHandling thiết lập để TypeNameHandling.All, tôi đã mong rằng nó cũng sẽ cung cấp một $type cho mỗi trường hợp trong danh sách nhưng dường như không là trường hợp. Đây là kết quả thực tế:

{ 
    "$type": "System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib", 
    "$values": [ 
     "hi there", 
     1, 
     2.33 
    ] 
} 

tôi cần điều này để có Loại cụ thể Tên Xử lý đối với những loại nguyên thủy vì nếu tôi thêm một giá trị Int32 trong danh sách và khi nó quay trở lại sau khi deserializing nó JSON.NET đặt nó là Int64. Đó là một vấn đề lớn đối với tôi bởi vì tôi đang cố gắng gọi một số phương pháp và để làm điều đó tôi cần phải so sánh các tham số và chúng PHẢI có cùng loại. Có cách nào hay một thiết lập bạn có thể đặt trong JSON.NET để đạt được những gì tôi cần?

Tôi đã nhìn thấy điều này post nhưng những gì nó làm là anh ấy đang cố gắng thay đổi hành vi mặc định và luôn trả lại Int32 mà không phải là những gì tôi đang tìm kiếm.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn

+0

Bạn sẽ cần để bọc các nguyên thủy của bạn bên trong một cái gì đó như 'TypeWrapper ' từ [Deserialize enum cụ thể vào system.enum trong Json.Net] (https://stackoverflow.com/questions/31351262/deserialize-specific-enum-into-system-enum- trong-json-net). – dbc

Trả lời

1

Bạn có thể tạo một lớp bao bọc cho các kiểu dữ liệu, bao gồm các nhà khai thác ngầm như bạn muốn:

class TypeWrapper 
{ 
    public object Value { get; set; } 
    public string Type { get; set; } 

    public static implicit operator TypeWrapper(long value) 
    { 
     return new TypeWrapper { Value = value, Type = typeof(long).FullName }; 
    } 

    public static implicit operator long(TypeWrapper value) 
    { 
     return (long)value.Value; 
    } 

    public static implicit operator TypeWrapper(int value) 
    { 
     return new TypeWrapper { Value = value, Type = typeof(int).FullName }; 
    } 

    public static implicit operator int(TypeWrapper value) 
    { 
     return (int)value.Value; 
    } 
} 

Sau đó, bạn sẽ có yếu tố' loại khi serialize dữ liệu:

var data = new List<TypeWrapper> { 1, 2L }; 
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data); 
Console.WriteLine(json); 

// result: [{"Value":1,"Type":"System.Int32"},{"Value":2,"Type":"System.Int64"}] 
+1

Tôi vẫn hy vọng một cách trực tiếp hơn để làm điều đó (tức là một thay đổi cài đặt đơn giản hoặc một cái gì đó). Nhưng nếu không có bất kỳ thì điều này có lẽ sẽ là những gì tôi sẽ đi. Cảm ơn – Bairose

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