आप इस स्थिति से निपटने के लिए एक कस्टम जेसन कनवर्टर का उपयोग कर सकते हैं। जहां भी आप EmployerNormalized
की अपेक्षा कर रहे हैं, कनवर्टर जांच सकता है कि उस संपत्ति का मूल्य -1
है और शून्य वापस लौटाता है, अन्यथा इसे सामान्य रूप से deserialize। यहाँ
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();
}
}
और यह कैसे उपयोग करने के लिए डेमो दर्शाता है:
यहाँ कनवर्टर के लिए कोड है
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;
}
}
यहाँ उत्पादन किया जाता है:
good
company: self
codes: 4581, 6732, 9121, 9999, 5947, 8322, 8351, 7335, 9999, 4225, 8399
bad
(null)
महत्वपूर्ण नोट: आपको सजाने के लिए प्रेरित हो सकते हैं [JsonConverter(typeof(EmployerNormalizedConverter))]
के साथ 0 वर्ग, लेकिन यदि आप ऐसा करते हैं, तो कनवर्टर, अपने वर्तमान रूप में, StackOverflowException
के साथ त्रुटियों तक खुद को तब तक कॉल करना समाप्त कर देगा। यदि आपको विशेषता का उपयोग करना/चाहते हैं, तो कनवर्टर में ReadJson
विधि का कोड बदलना होगा ताकि यह मैन्युअल रूप से EmployerNormalized
वर्ग का उदाहरण बनाता है और token.ToObject<EmployerNormalized>()
पर कॉल करने के बजाए अपनी सभी संपत्तियों को व्यक्तिगत रूप से पॉप्युलेट करता है।
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;
}
आग जो कोई भी अनुप्रयोग है कि इस JSON :) –
काश मैं कर सकता उत्पन्न करता है विकसित: यहाँ कि प्रत्यावर्तन समस्या से बचने जाएगा
ReadJson
का एक वैकल्पिक संस्करण है। मैं अब इसके लिए फंस गया हूं, हालांकि, मुझे उन विशिष्ट उदाहरणों को संभालने का एक तरीका पता लगाना है। – RouteMapper