2015-07-30 11 views
5

Ich habe ein JSON-Objekt (NewtonSoft.JObject). Es enthält mehrere Einträge in diesem Format:Überprüfen Sie, ob ein Schlüssel in einem NewtonSoft JObject vorhanden ist. C#

{ 
    "id": "b65ngx59-2c67-4f5b-9705-8525d65e1b8", 
    "name": "TestSample", 
    "versions": [] 
}, 
{ 
    "id": "8acd8343-617f-4354-9b29-87a251d2f3e7", 
    "name": "template 2", 
    "versions": [ 
    { 
     "id": "556ng956-57e1-47d8-9801-9789d47th5a5", 
     "template_id": "8acd8343-617f-4354-9b29-87a251d2f3e7", 
     "active": 1, 
     "name": "1.0", 
     "subject": "<%subject%>", 
     "updated_at": "2015-07-24 08:32:58" 
    } 
    ] 
} 

Hinweis: Um nur ein Beispiel.

ich einen Code geschrieben haben, so dass ich die IDs in einer Liste erhalten:

List<JToken> templateIdList = jObj.Descendants() 
      .Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "id") 
      .Select(p => ((JProperty)p).Value) 
      .ToList(); 

Hinweis: jObj ist das JSON-Objekt

Die Ausgabeliste ist:

[0] - b65ngx59-2c67-4f5b-9705-8525d65e1b8 
[1] - 8acd8343-617f-4354-9b29-87a251d2f3e7 
[2] - 556ng956-57e1-47d8-9801-9789d47th5a5 

Es gibt alle IDs.Now möchte ich eine Bedingung der Linq so hinzufügen, dass nur die template_ids enthält aktive mit Wert = 1 in ihnen sollte in der Liste aufgefüllt werden.

die erforderliche Ausgabe:

[0] - 8acd8343-617f-4354-9b29-87a251d2f3e7 

Welche Änderungen sollte ich auf die Linq-Abfrage machen diese zu bekommen?

EDIT: Der vollständige Code ist

public bool CheckIfTemplateExists(string template) 
{ 
bool exists = false; 

//web service call to retrieve jsonTemplates 
JObject jObj = JObject.Parse(jsonTemplates); 

List<JToken> templateIdList = jObj.Descendants() 
       .Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "id") 
       .Select(p => ((JProperty)p).Value) 
       .ToList(); 

if(templateIdList.IndexOf(template) != -1) 
    { 
    exists = true; 
    } 
return exists 
} 

Die jsonTemplates in dem obigen Code ist eine Zeichenfolge des Formats:

{"templates": 
[{"id":"b65cae59-2c67-4f5b-9705-07465d65e1b8", 
"name":"TestSample","versions":[]}, 
{"id":"8edb8343-617f-4354-9b29-87a251d2f3e7", 
"name":"Template1", 
"versions":[{"id":"556bb956-57e1-47d8-9801-9388d47cc5a5", 
"template_id":"8edb8343-617f-4354-9b29-87a251d2f3e7", 
"active":1, 
"name":"1.0","subject":"\u003c%subject%\u003e", 
"updated_at":"2015-07-24 08:32:58"}]} 

Antwort

5

Versuchen Sie dieses:

List<JToken> templateIdList = jObj["templates"].Children() 
      .Where(child => child["versions"] != null 
       && child["versions"].Any(version => version["active"].Value<int>() == 1)) 
      .Select(x => x["id"]); 
+0

Hallo Danke fürs Beantworten..Ich habe deinen Code versucht aber es gibt Fehler " Zugriff auf untergeordneten Wert auf Newtonsoft.Json.Linq.JProperty nicht möglich. " – nitinvertigo

+0

Könnten Sie bitte das ganze Code-Fragment teilen, das nicht funktioniert? Ich werde versuchen zu reparieren. –

+0

Der Compiler gibt Fehler, wenn es die linq-Abfrage erreicht, die Sie – nitinvertigo

Verwandte Themen