2015-06-17 21 views
6

değerlerini karşılaştırın, sonra bunları karşılaştırmak için bir JSON dizesinden değerler almam gerekiyor. Sadece sırayla olduklarını doğruladım (artan/azalan). İlk ve ikinci 'seçimleri kontrol edip karşılaştırırdım. Daha gelişmiş bir şeyim yok.C# - JSON dize

DÜZENLEME/GÜNCELLEME: Her segmenti atlamak için bu tür sorguda joker karakterleri (*) nasıl kullanabilirim?

   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

serin projesi gibi geliyor! Sorun ne görünüyor? – cubrr

+0

LINQ, Jtoken, Jpath ve diğerlerini kullanmayı denedim ve hepsi boş ya da boş döndü. Yani topluluğa ulaşıyorum –

+0

Bunu JSON.NET ile deneyin (Nuget paketini ekledikten sonra Newtonsoft.Json kullanmanız gerekir): 'dynamic d = JsonSerializer.Deserialize (yourJsonString); Seçim numarasına erişmek için d.partner.campaign.round1.def123.community.choicec'. – cubrr

cevap

1

nedeni bazı zorluk iki "choicec" özellikleri JSON hiyerarşisinde aynı derinlikte olmadıklarını olabilir yaşıyoruz. Birincisi "round2"'un altında, ikincisi ise değil. Böylece basit endeksleme işe yaramayacaktır.

Eğer Json.NET kullanabilirler varsayarsak, seçenekleriniz şunlardır:

  1. Kullanım Descendants"choicec" adlı tüm özellikleri için bakmak ve kontrol etmek onlar sipariş edildiğinde:

    var obj = JObject.Parse(json); 
        bool inOrder = obj.Descendants() 
         .OfType<JProperty>() 
         .Where(p => p.Name == "choicec") 
         .Select(p => (int)p.Value) 
         .IsOrdered(); 
    
  2. adlı başka bir özellik varsa, aramayı JSON'unuzun bir kısmıyla sınırlamak için SelectTokens'u JsonPath wildcards ile kullanın.

    // 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(); 
    
    İşte

    .. "özyinelemeli iniş" anlamına gelen bir joker geçerli: sorgusuyla alakalı olmayan hiyerarşinizdeki. Mikkel R. Lund tarafından

    this question aşağıdaki IsOrdered uzantısını kullanma

:

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

Inanılmaz, kapsamlı ve yardımsever. –