2013-12-12 7 views
5

में तारों की एक सूची हो सकती है, मैं JSON तारों के संग्रह को deserialize करने के लिए C# का उपयोग कर रहा हूँ। प्रत्येक स्ट्रिंग में employer_normalized है जिसमें string और List<int> शामिल होना चाहिए जहां List में मान हमेशा सकारात्मक होते हैं। कुछ मामलों में employer_normalized-1 पर सेट है, इसलिए मैं इन मामलों को कुछ व्यवहार के साथ ओवरराइड करना चाहता हूं जो employer_normalized से null सेट करता है।JSON deserialize जो एक पूर्णांक या C#

public class EmployerNormalized 
{ 
    public string company; 
    public List<int> code; 
} 

अच्छा JSON

"employer_normalized": { 
     "company": "self", 
     "code": [ 
      "4581 ", 
      "6732 ", 
      "9121", 
      "9999 ", 
      "5947 ", 
      "8322 ", 
      "8351 ", 
      "7335 ", 
      "9999 ", 
      "4225 ", 
      "8399 " 
     ] 
     } 

बुरा JSON

"employer_normalized": -1 

मैं वर्तमान में Json.NET उपयोग कर रहा हूँ मेरी JSON पार्स करने के लिए:

यहाँ मेरी वर्ग है। इस समस्या को हल करने के लिए एक सुरुचिपूर्ण समाधान क्या है? क्या यह employer_normalized मान null पर सेट करना सबसे अच्छा है यदि यह -1 है? यदि हां, तो मैं यह कैसे कर सकता हूं?

+2

आग जो कोई भी अनुप्रयोग है कि इस JSON :) –

+0

काश मैं कर सकता उत्पन्न करता है विकसित: यहाँ कि प्रत्यावर्तन समस्या से बचने जाएगा ReadJson का एक वैकल्पिक संस्करण है। मैं अब इसके लिए फंस गया हूं, हालांकि, मुझे उन विशिष्ट उदाहरणों को संभालने का एक तरीका पता लगाना है। – RouteMapper

उत्तर

3

आप इस स्थिति से निपटने के लिए एक कस्टम जेसन कनवर्टर का उपयोग कर सकते हैं। जहां भी आप 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; 
} 
+0

यह सही है! धन्यवाद! – RouteMapper

+0

कोई समस्या नहीं; मदद करने में खुशी। –

+0

कोई विचार क्यों मुझे यह त्रुटि मिल रही है? 'Newtonsoft.Json.dll' में' System.StackOverflowException 'प्रकार का एक अनचाहे अपवाद हुआ। मैं उन वस्तुओं की एक सूची से निपट रहा हूं जिनमें 'नियोक्ता नामांकित' ऑब्जेक्ट शामिल है। – RouteMapper

1

मैं इस बेकार है पता है, लेकिन आप पहली बार अपने अच्छा JSON की संरचना के साथ JSON string एक Object को पार्स करने के लिए कोशिश कर सकते हैं, और त्रुटि पार्स करने के मामले में, दूसरे मामले (बुरा JSON) को पार्स।

+0

तो क्या आपका मतलब है कि मुझे एक वर्ग बनाना चाहिए जो अपवाद के मामले में खराब JSON का प्रतिनिधित्व करता है और उस पर पार्स करता है? – RouteMapper

+0

बहुत अधिक - * अजीब * – everton

+0

मुझे लगता है कि सबसे आसान समाधान केवल 'नियोक्ता_नार्मलाइज्ड' को 'शून्य' पर सेट करना है, लेकिन मुझे इसे ध्यान में रखना होगा क्योंकि मैं इन रिकॉर्ड्स को डेटाबेस में डालने की योजना बना रहा हूं। यदि मैं एक 'शून्य' मान को एक गैर-शून्य क्षेत्र में डालता हूं तो मेरा डीबी चिल्लाएगा। ओह! – RouteMapper

संबंधित मुद्दे