2015-06-17 6 views
6

से मानों की तुलना करें मुझे JSON स्ट्रिंग से मान निकालने की आवश्यकता है ताकि मैं उनकी तुलना कर सकूं। मुझे केवल यह सत्यापित करने की आवश्यकता है कि वे क्रम में हैं (आरोही/अवरोही)। मैं पहले और दूसरे 'विकल्प' की जांच करने और तुलना करने जा रहा था। मैं और कुछ भी उन्नत नहीं है।सी # - प्राप्त करें, फिर JSON स्ट्रिंग

संपादित/अद्यतन: मैं प्रत्येक सेगमेंट को छोड़ने के लिए इस प्रकार की क्वेरी में वाइल्डकार्ड (*) का उपयोग कैसे कर सकता हूं?

   string one = (string)o[this.Context[*WILDCARD*]["cid1"]].ToString(); 


      /* this works, but has too many [] 
      string one = (string)o[this.Context["partner"]] 
       [this.Context["campaign"]] 
       [this.Context["segment1"]] 
       [this.Context["segment2"]] 
       [this.Context["qid2"]] 
       ["community"] 
       [this.Context["cid1"]].ToString(); 
      */ 


{ 
    "partner": { 
    "campaign": { 
     "round1": { 
     "round2": { 
      "def123": { 
      "community": { 
       "choicec": 28 
      }, 
      "user": { 
       "choice": "choicec", 
       "writeDateUTC": "2015-06-15T17:21:59Z" 
      } 
      } 
     }, 
     "abc321": { 
      "community": { 
      "choicec": 33 
      }, 
      "user": { 
      "choice": "choicec", 
      "writeDateUTC": "2015-06-15T17:21:59Z" 
      } 
     } 
     } 
    } 
    } 
} 
+0

एक शांत परियोजना की तरह लगता है! आखिर समस्या क्या लग रही है? – cubrr

+0

Ive LINQ, Jtoken, Jpath, और अन्य का उपयोग करने का प्रयास किया और सभी असफल हो गए या खाली लौट आए। तो मैं समुदाय तक पहुंच रहा हूं –

+0

JSON.NET के साथ इसे आज़माएं (आपको Nuget पैकेज जोड़ने के बाद 'Newtonsoft.Json' का उपयोग करने की आवश्यकता होगी): 'गतिशील डी = जेसनसेरियलज़र। डिसेरियलाइज (yourJsonString);' फिर' पसंद संख्या तक पहुंचने के लिए d.partner.campaign.round1.def123.community.choicec'। – cubrr

उत्तर

1

कारण आप कुछ कठिनाई हो सकता है कि दो "choicec" गुण JSON पदानुक्रम में एक ही गहराई में नहीं हैं कर रहे हैं। पहला "round2" के नीचे है जबकि दूसरा नहीं है। इस प्रकार सीधा सूचकांक काम नहीं करेगा।

यह मानते हुए कि आप Json.NET उपयोग कर सकते हैं, आपके विकल्प हैं:

  1. उपयोग Descendants के लिए "choicec" नामित सभी गुण देखने के लिए और जांच करने के लिए अगर वे आदेश दिया जाता है:

    var obj = JObject.Parse(json); 
        bool inOrder = obj.Descendants() 
         .OfType<JProperty>() 
         .Where(p => p.Name == "choicec") 
         .Select(p => (int)p.Value) 
         .IsOrdered(); 
    
  2. SelectTokensJsonPath wildcards के साथ अपने JSON के किसी हिस्से को खोज प्रतिबंधित करने के लिए, यदिनामक अन्य गुण होने पर उपयोग करेंअपने पदानुक्रम में है कि क्वेरी से प्रासंगिक नहीं हैं:

    // Find all properties named "choicec" under "community" recursively under "campaign" under "partner". 
        bool inOrder = obj.SelectTokens("partner.campaign..community.choicec") 
         .Select(o => (int)o) 
         .IsOrdered(); 
    

    यहाँ .. एक वाइल्डकार्ड जिसका अर्थ है 'पुनरावर्ती वंश "है।

this question से निम्नलिखित IsOrdered एक्सटेंशन का उपयोग करना Mikkel R. Lund द्वारा:

public static class EnumerableExtensions 
{ 
    // Taken from http://stackoverflow.com/questions/19786101/native-c-sharp-support-for-checking-if-an-ienumerable-is-sorted 
    public static bool IsOrdered<T>(this IEnumerable<T> collection, IComparer<T> comparer = null) 
    { 
     if (collection == null) 
      throw new ArgumentNullException(); 
     comparer = comparer ?? Comparer<T>.Default; 

     using (var enumerator = collection.GetEnumerator()) 
     { 
      if (enumerator.MoveNext()) 
      { 
       var previous = enumerator.Current; 

       while (enumerator.MoveNext()) 
       { 
        var current = enumerator.Current; 

        if (comparer.Compare(previous, current) > 0) 
         return false; 

        previous = current; 
       } 
      } 
     } 

     return true; 
    } 
} 
+1

सही, पूरी तरह से और सहायक हैं। –

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