2016-05-22 23 views
7

Tôi đang tạo một tệp JSON với Newtonsoft.Json từ một nhóm các lớp. Các tập tin được tạo ra là rất lớn, vì vậy tôi đã tạo ra JsonProperty 's cho các thuộc tính để giảm kích thước và thêm JsonIgnore và định dạng tùy chỉnh cho một số kiểu dữ liệu.Tôi có thể tùy ý tắt thuộc tính JsonIgnore trong thời gian chạy không?

Kết quả là giảm từ 24MB xuống 1MB, điều này thật tuyệt vời; tuy nhiên, tôi muốn tùy chọn tạo phiên bản đầy đủ hoặc phiên bản thuộc tính bị giảm khi chạy.

Có cách nào tôi có thể nhận bộ nối tiếp để tùy chọn sử dụng các thuộc tính không?

+1

lẽ hiển thị một số mã như thế nào bạn có quản lý để tùy chỉnh JSON.Net cho đến nay. –

Trả lời

16

Có, điều này có thể được thực hiện bằng cách sử dụng tùy chỉnh ContractResolver.

Bạn không hiển thị bất kỳ mã nào, vì vậy tôi sẽ chỉ tạo một ví dụ. Giả sử tôi có một lớp học Foo như được hiển thị bên dưới. Tôi muốn các thuộc tính IdName trong đầu ra tuần tự hóa, nhưng tôi chắc chắn không quan tâm đến số AlternateNameColor. Tôi đã đánh dấu những người có số [JsonIgnore]. Tôi muốn mô tả xuất hiện, nhưng đôi khi điều này có thể thực sự dài, vì vậy tôi đã sử dụng tùy chỉnh JsonConverter để giới hạn độ dài của nó. Tôi cũng muốn sử dụng tên thuộc tính ngắn hơn cho mô tả, vì vậy tôi đã đánh dấu nó bằng [JsonProperty("Desc")].

class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [JsonIgnore] 
    public string AlternateName { get; set; } 
    [JsonProperty("Desc")] 
    [JsonConverter(typeof(StringTruncatingConverter))] 
    public string Description { get; set; } 
    [JsonIgnore] 
    public string Color { get; set; } 
} 

Khi tôi serialize một thể hiện những điều trên ...

Foo foo = new Foo 
{ 
    Id = 1, 
    Name = "Thing 1", 
    AlternateName = "The First Thing", 
    Description = "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.", 
    Color = "Yellow" 
}; 

string json = JsonConvert.SerializeObject(foo, Formatting.Indented); 

... Tôi nhận được kết quả này:

{ 
    "Id": 1, 
    "Name": "Thing 1", 
    "Desc": "This is some lengthy text describing Thing 1 " 
} 

Bây giờ, chúng ta hãy nói rằng đôi khi tôi muốn nhận được đầu ra JSON đầy đủ, bỏ qua các tùy chỉnh của tôi. Tôi có thể sử dụng tùy chỉnh ContractResolver để lập trình "không chính xác" các thuộc tính từ lớp. Dưới đây là các mã cho phân giải:

class IgnoreJsonAttributesResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     IList<JsonProperty> props = base.CreateProperties(type, memberSerialization); 
     foreach (var prop in props) 
     { 
      prop.Ignored = false; // Ignore [JsonIgnore] 
      prop.Converter = null; // Ignore [JsonConverter] 
      prop.PropertyName = prop.UnderlyingName; // restore original property name 
     } 
     return props; 
    } 
} 

Để sử dụng bộ giải quyết, tôi thêm nó vào JsonSerializerSettings và vượt qua các thiết lập để serializer như thế này:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.ContractResolver = new IgnoreJsonAttributesResolver(); 
settings.Formatting = Formatting.Indented; 

string json = JsonConvert.SerializeObject(foo, settings); 

Sản lượng hiện nay bao gồm các thuộc tính bỏ qua, và mô tả không còn cắt ngắn:

{ 
    "Id": 1, 
    "Name": "Thing 1", 
    "AlternateName": "The First Thing", 
    "Description": "This is some lengthy text describing Thing 1 which you'll no doubt find very interesting and useful.", 
    "Color": "Yellow" 
} 

Full demo ở đây: https://dotnetfiddle.net/WZpeWt

+0

Brill trả lời Brian, hoạt động như một sự quyến rũ, bạn có biết cách tắt thuộc tính [JsonProperty ("ShortName")] không? –

+0

Có, thêm 'prop.PropertyName = prop.UnderlyingName;' bên trong vòng lặp trong trình phân giải. Điều này sẽ khiến cho khách sạn sử dụng tên ban đầu. –

+0

Tôi đã cập nhật câu trả lời và mã demo. –

1

Json hỗ trợ chúng tôi bỏ qua tài sản không muốn trả lại. Ví dụ

class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public string AlternateName { get; set; }  
} 

Làm thế nào để sử dụng nó:

Foo foo = new Foo 
{ 
    Id = 1, 
    Name = "Thing 1", 
    AlternateName = null, 
}; 

string json = JsonConvert.SerializeObject(foo); 
+1

Điều này không trả lời câu hỏi đã được hỏi. –

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