Bạn có thể sử dụng JsonConverter tùy chỉnh để xử lý tình huống này. Bất cứ nơi nào bạn đang mong đợi một EmployerNormalized
, bộ chuyển đổi có thể kiểm tra xem giá trị của thuộc tính đó là -1
và trả về null, nếu không thì deserialize nó bình thường.
Đây là mã cho bộ chuyển đổi:
public class EmployerNormalizedConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(EmployerNormalized));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
return token.ToObject<EmployerNormalized>();
}
return null;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
Và đây là một bản demo cho thấy làm thế nào để sử dụng nó:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""good"" : {
""company"": ""self"",
""code"": [
""4581 "",
""6732 "",
""9121"",
""9999 "",
""5947 "",
""8322 "",
""8351 "",
""7335 "",
""9999 "",
""4225 "",
""8399 ""
]
},
""bad"" : -1
}";
Wrapper wrapper =
JsonConvert.DeserializeObject<Wrapper>(json,
new EmployerNormalizedConverter());
DumpEmployer("good", wrapper.good);
DumpEmployer("bad", wrapper.bad);
}
private static void DumpEmployer(string prop, EmployerNormalized emp)
{
Console.WriteLine(prop);
if (emp != null)
{
Console.WriteLine(" company: " + emp.company);
Console.WriteLine(" codes: " +
string.Join(", ", emp.code.Select(c => c.ToString())));
}
else
Console.WriteLine(" (null)");
}
public class Wrapper
{
public EmployerNormalized good { get; set; }
public EmployerNormalized bad { get; set; }
}
public class EmployerNormalized
{
public string company;
public List<int> code;
}
}
Dưới đây là kết quả:
good
company: self
codes: 4581, 6732, 9121, 9999, 5947, 8322, 8351, 7335, 9999, 4225, 8399
bad
(null)
Lưu ý quan trọng: Bạn có thể bị cám dỗ để trang trí EmployerNormalized
lớp học với [JsonConverter(typeof(EmployerNormalizedConverter))]
, nhưng nếu bạn làm điều đó, sau đó chuyển đổi, ở dạng hiện tại của nó, sẽ kết thúc lên gọi chính nó đệ quy cho đến khi nó lỗi ra với một StackOverflowException
. Nếu bạn cần/muốn sử dụng thuộc tính, thì mã của phương thức ReadJson
trong trình chuyển đổi sẽ cần được thay đổi để tạo thủ công một cá thể của lớp EmployerNormalized
và điền tất cả các thuộc tính riêng lẻ thay vì gọi token.ToObject<EmployerNormalized>()
. Dưới đây là một phiên bản thay thế của ReadJson
rằng sẽ tránh được những vấn đề đệ quy:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
{
EmployerNormalized employer = new EmployerNormalized();
employer.company = token["company"].ToString();
employer.code = token["code"].ToObject<List<int>>();
return employer;
}
return null;
}
cháy bất cứ ai phát triển ứng dụng mà tạo ra JSON này :) –
Tôi ước gì tôi có thể. Tôi đang mắc kẹt với điều này cho bây giờ, mặc dù, vì vậy tôi đã phải tìm ra một cách để xử lý những trường hợp cụ thể. – RouteMapper