2016-07-15 19 views
6

Đoạn mã dưới đây sẽ ném một ngoại lệ:Deserialize tài sản regex null với json.net

class SimpleClassWithRegex 
{ 
    public Regex RegProp { get; set; } 
} 

[TestMethod] 
public void RegexTest() 
{ 
    string json = JsonConvert.SerializeObject(new SimpleClassWithRegex {RegProp = null}); 
    // json = {"RegProp":null} 
    SimpleClassWithRegex obj = JsonConvert.DeserializeObject<SimpleClassWithRegex>(json); 
    //Above line throws a JsonSerializationException 
} 

Điều này có vẻ như hành vi xa lạ với tôi, ai đó có thể giải thích tại sao đây không phải là lỗi? Hoặc có lẽ đề nghị một workaround? Lập tức một đối tượng Regex thay cho giá trị rỗng của khóa học sẽ dừng điều này khỏi việc ném một ngoại lệ.

Ngoại lệ sản xuất là:

Newtonsoft.Json.JsonSerializationException: Unexpected token when reading Regex. Path 'RegProp', line 1, position 15.

Trả lời

3

CẬP NHẬT

Dường như vấn đề này đã được cố định trong release 10.0.1 (tháng 3 năm 2017).


Điều này giống như lỗi trong lớp học của Json.Net RegexConverter. Phương pháp ReadJson trông như thế này:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
{ 
    if (reader.TokenType == JsonToken.StartObject) 
    { 
     return ReadRegexObject(reader, serializer); 
    } 

    if (reader.TokenType == JsonToken.String) 
    { 
     return ReadRegexString(reader); 
    } 

    throw JsonSerializationException.Create(reader, "Unexpected token when reading Regex."); 
} 

Như bạn thấy, nó không phải là mong đợi hoặc kiểm tra cho một mã thông báo null từ người đọc, vì vậy nó được rơi qua vào dòng đó ném một JsonSerializationException.

Bạn có thể muốn report an issue liên kết ngược lại câu hỏi SO này.

Là một khắc phục, bạn có thể lấy được chuyển đổi của riêng bạn từ RegexConverter và thêm việc kiểm tra:

public class ImprovedRegexConverter : RegexConverter 
{ 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (reader.TokenType == JsonToken.Null) 
     { 
      return null; 
     } 
     return base.ReadJson(reader, objectType, existingValue, serializer); 
    } 
} 

Khi bạn deserialize, vượt qua một thể hiện của chuyển đổi tùy chỉnh của bạn với phương pháp DeserializeObject như thế này:

SimpleClassWithRegex obj = 
    JsonConvert.DeserializeObject<SimpleClassWithRegex>(json, new ImprovedRegexConverter()); 

Alterntatively, bạn có thể thêm một thuộc tính [JsonConverter]-Regex thành viên lớp học của bạn như thế này:

class SimpleClassWithRegex 
{ 
    [JsonConverter(typeof(ImprovedRegexConverter))] 
    public Regex RegProp { get; set; } 
} 

Fiddle: https://dotnetfiddle.net/BIqmd6

+0

Cảm ơn rất nhiều vì cách giải quyết khác. Tôi cũng sẽ xem xét nộp báo cáo lỗi. –

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